From 121db637789d3d1e73ecbd6c35a3f063d831bca9 Mon Sep 17 00:00:00 2001 From: qianlifeng Date: Sun, 22 Dec 2013 19:35:21 +0800 Subject: [PATCH] UI staff --- .../WinAlfred.Plugin.System/Images/lock.png | Bin 0 -> 4625 bytes Plugins/WinAlfred.Plugin.System/Main.cs | 50 +- .../WinAlfred.Plugin.System.csproj | 7 +- PythonEnv/2.7/Include/Python-ast.h | 535 --- PythonEnv/2.7/Include/Python.h | 178 - PythonEnv/2.7/Include/abstract.h | 1396 ------ PythonEnv/2.7/Include/asdl.h | 45 - PythonEnv/2.7/Include/ast.h | 13 - PythonEnv/2.7/Include/bitset.h | 32 - PythonEnv/2.7/Include/boolobject.h | 36 - PythonEnv/2.7/Include/bufferobject.h | 33 - PythonEnv/2.7/Include/bytearrayobject.h | 57 - PythonEnv/2.7/Include/bytes_methods.h | 75 - PythonEnv/2.7/Include/bytesobject.h | 27 - PythonEnv/2.7/Include/cStringIO.h | 73 - PythonEnv/2.7/Include/cellobject.h | 28 - PythonEnv/2.7/Include/ceval.h | 153 - PythonEnv/2.7/Include/classobject.h | 83 - PythonEnv/2.7/Include/cobject.h | 89 - PythonEnv/2.7/Include/code.h | 107 - PythonEnv/2.7/Include/codecs.h | 167 - PythonEnv/2.7/Include/compile.h | 40 - PythonEnv/2.7/Include/complexobject.h | 66 - PythonEnv/2.7/Include/datetime.h | 239 - PythonEnv/2.7/Include/descrobject.h | 94 - PythonEnv/2.7/Include/dictobject.h | 156 - PythonEnv/2.7/Include/dtoa.h | 15 - PythonEnv/2.7/Include/enumobject.h | 17 - PythonEnv/2.7/Include/errcode.h | 36 - PythonEnv/2.7/Include/eval.h | 25 - PythonEnv/2.7/Include/fileobject.h | 97 - PythonEnv/2.7/Include/floatobject.h | 140 - PythonEnv/2.7/Include/frameobject.h | 89 - PythonEnv/2.7/Include/funcobject.h | 76 - PythonEnv/2.7/Include/genobject.h | 40 - PythonEnv/2.7/Include/graminit.h | 87 - PythonEnv/2.7/Include/grammar.h | 93 - PythonEnv/2.7/Include/import.h | 71 - PythonEnv/2.7/Include/intobject.h | 81 - PythonEnv/2.7/Include/intrcheck.h | 15 - PythonEnv/2.7/Include/iterobject.h | 23 - PythonEnv/2.7/Include/listobject.h | 68 - PythonEnv/2.7/Include/longintrepr.h | 103 - PythonEnv/2.7/Include/longobject.h | 135 - PythonEnv/2.7/Include/marshal.h | 25 - PythonEnv/2.7/Include/memoryobject.h | 74 - PythonEnv/2.7/Include/metagrammar.h | 18 - PythonEnv/2.7/Include/methodobject.h | 93 - PythonEnv/2.7/Include/modsupport.h | 134 - PythonEnv/2.7/Include/moduleobject.h | 24 - PythonEnv/2.7/Include/node.h | 43 - PythonEnv/2.7/Include/object.h | 1011 ----- PythonEnv/2.7/Include/objimpl.h | 354 -- PythonEnv/2.7/Include/opcode.h | 162 - PythonEnv/2.7/Include/osdefs.h | 63 - PythonEnv/2.7/Include/parsetok.h | 64 - PythonEnv/2.7/Include/patchlevel.h | 43 - PythonEnv/2.7/Include/pgen.h | 18 - PythonEnv/2.7/Include/pgenheaders.h | 42 - PythonEnv/2.7/Include/py_curses.h | 176 - PythonEnv/2.7/Include/pyarena.h | 62 - PythonEnv/2.7/Include/pycapsule.h | 56 - PythonEnv/2.7/Include/pyconfig.h | 759 ---- PythonEnv/2.7/Include/pyctype.h | 31 - PythonEnv/2.7/Include/pydebug.h | 41 - PythonEnv/2.7/Include/pyerrors.h | 328 -- PythonEnv/2.7/Include/pyexpat.h | 48 - PythonEnv/2.7/Include/pyfpe.h | 176 - PythonEnv/2.7/Include/pygetopt.h | 18 - PythonEnv/2.7/Include/pymacconfig.h | 102 - PythonEnv/2.7/Include/pymactoolbox.h | 217 - PythonEnv/2.7/Include/pymath.h | 192 - PythonEnv/2.7/Include/pymem.h | 122 - PythonEnv/2.7/Include/pyport.h | 941 ---- PythonEnv/2.7/Include/pystate.h | 200 - PythonEnv/2.7/Include/pystrcmp.h | 23 - PythonEnv/2.7/Include/pystrtod.h | 45 - PythonEnv/2.7/Include/pythonrun.h | 181 - PythonEnv/2.7/Include/pythread.h | 41 - PythonEnv/2.7/Include/rangeobject.h | 28 - PythonEnv/2.7/Include/setobject.h | 99 - PythonEnv/2.7/Include/sliceobject.h | 44 - PythonEnv/2.7/Include/stringobject.h | 210 - PythonEnv/2.7/Include/structmember.h | 99 - PythonEnv/2.7/Include/structseq.h | 41 - PythonEnv/2.7/Include/symtable.h | 98 - PythonEnv/2.7/Include/sysmodule.h | 29 - PythonEnv/2.7/Include/timefuncs.h | 26 - PythonEnv/2.7/Include/token.h | 85 - PythonEnv/2.7/Include/traceback.h | 31 - PythonEnv/2.7/Include/tupleobject.h | 61 - PythonEnv/2.7/Include/ucnhash.h | 33 - PythonEnv/2.7/Include/unicodeobject.h | 1413 ------ PythonEnv/2.7/Include/warnings.h | 23 - PythonEnv/2.7/Include/weakrefobject.h | 85 - PythonEnv/2.7/Lib/UserDict.py | 180 - PythonEnv/2.7/Lib/UserDict.pyc | Bin 10485 -> 0 bytes PythonEnv/2.7/Lib/_abcoll.py | 671 --- PythonEnv/2.7/Lib/_abcoll.pyc | Bin 28758 -> 0 bytes PythonEnv/2.7/Lib/_weakrefset.py | 196 - PythonEnv/2.7/Lib/_weakrefset.pyc | Bin 11216 -> 0 bytes PythonEnv/2.7/Lib/abc.py | 185 - PythonEnv/2.7/Lib/abc.pyc | Bin 6550 -> 0 bytes PythonEnv/2.7/Lib/codecs.py | 1098 ----- PythonEnv/2.7/Lib/codecs.pyc | Bin 40080 -> 0 bytes PythonEnv/2.7/Lib/copy_reg.py | 201 - PythonEnv/2.7/Lib/copy_reg.pyc | Bin 5520 -> 0 bytes PythonEnv/2.7/Lib/distutils/__init__.py | 101 - PythonEnv/2.7/Lib/distutils/__init__.pyc | Bin 3876 -> 0 bytes PythonEnv/2.7/Lib/distutils/distutils.cfg | 6 - PythonEnv/2.7/Lib/encodings/__init__.py | 157 - PythonEnv/2.7/Lib/encodings/__init__.pyc | Bin 4358 -> 0 bytes PythonEnv/2.7/Lib/encodings/__init__.pyo | Bin 4358 -> 0 bytes PythonEnv/2.7/Lib/encodings/aliases.py | 527 --- PythonEnv/2.7/Lib/encodings/aliases.pyc | Bin 8765 -> 0 bytes PythonEnv/2.7/Lib/encodings/aliases.pyo | Bin 8765 -> 0 bytes PythonEnv/2.7/Lib/encodings/ascii.py | 50 - PythonEnv/2.7/Lib/encodings/ascii.pyc | Bin 2231 -> 0 bytes PythonEnv/2.7/Lib/encodings/base64_codec.py | 79 - PythonEnv/2.7/Lib/encodings/base64_codec.pyc | Bin 3763 -> 0 bytes PythonEnv/2.7/Lib/encodings/big5.py | 39 - PythonEnv/2.7/Lib/encodings/big5.pyc | Bin 1735 -> 0 bytes PythonEnv/2.7/Lib/encodings/big5hkscs.py | 39 - PythonEnv/2.7/Lib/encodings/big5hkscs.pyc | Bin 1775 -> 0 bytes PythonEnv/2.7/Lib/encodings/bz2_codec.py | 102 - PythonEnv/2.7/Lib/encodings/bz2_codec.pyc | Bin 4643 -> 0 bytes PythonEnv/2.7/Lib/encodings/charmap.py | 69 - PythonEnv/2.7/Lib/encodings/charmap.pyc | Bin 3428 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp037.py | 307 -- PythonEnv/2.7/Lib/encodings/cp037.pyc | Bin 2804 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp1006.py | 307 -- PythonEnv/2.7/Lib/encodings/cp1006.pyc | Bin 2890 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp1026.py | 307 -- PythonEnv/2.7/Lib/encodings/cp1026.pyc | Bin 2818 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp1140.py | 307 -- PythonEnv/2.7/Lib/encodings/cp1140.pyc | Bin 2804 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp1250.py | 307 -- PythonEnv/2.7/Lib/encodings/cp1250.pyc | Bin 2841 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp1251.py | 307 -- PythonEnv/2.7/Lib/encodings/cp1251.pyc | Bin 2838 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp1252.py | 307 -- PythonEnv/2.7/Lib/encodings/cp1252.pyc | Bin 2841 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp1253.py | 307 -- PythonEnv/2.7/Lib/encodings/cp1253.pyc | Bin 2854 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp1254.py | 307 -- PythonEnv/2.7/Lib/encodings/cp1254.pyc | Bin 2843 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp1255.py | 307 -- PythonEnv/2.7/Lib/encodings/cp1255.pyc | Bin 2862 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp1256.py | 307 -- PythonEnv/2.7/Lib/encodings/cp1256.pyc | Bin 2840 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp1257.py | 307 -- PythonEnv/2.7/Lib/encodings/cp1257.pyc | Bin 2848 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp1258.py | 307 -- PythonEnv/2.7/Lib/encodings/cp1258.pyc | Bin 2846 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp424.py | 307 -- PythonEnv/2.7/Lib/encodings/cp424.pyc | Bin 2834 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp437.py | 698 --- PythonEnv/2.7/Lib/encodings/cp437.pyc | Bin 8039 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp500.py | 307 -- PythonEnv/2.7/Lib/encodings/cp500.pyc | Bin 2804 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp720.py | 309 -- PythonEnv/2.7/Lib/encodings/cp720.pyc | Bin 2901 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp737.py | 698 --- PythonEnv/2.7/Lib/encodings/cp737.pyc | Bin 8267 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp775.py | 697 --- PythonEnv/2.7/Lib/encodings/cp775.pyc | Bin 8053 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp850.py | 698 --- PythonEnv/2.7/Lib/encodings/cp850.pyc | Bin 7786 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp852.py | 698 --- PythonEnv/2.7/Lib/encodings/cp852.pyc | Bin 8055 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp855.py | 698 --- PythonEnv/2.7/Lib/encodings/cp855.pyc | Bin 8236 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp856.py | 307 -- PythonEnv/2.7/Lib/encodings/cp856.pyc | Bin 2866 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp857.py | 694 --- PythonEnv/2.7/Lib/encodings/cp857.pyc | Bin 7776 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp858.py | 698 --- PythonEnv/2.7/Lib/encodings/cp858.pyc | Bin 7756 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp860.py | 698 --- PythonEnv/2.7/Lib/encodings/cp860.pyc | Bin 8022 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp861.py | 698 --- PythonEnv/2.7/Lib/encodings/cp861.pyc | Bin 8033 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp862.py | 698 --- PythonEnv/2.7/Lib/encodings/cp862.pyc | Bin 8168 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp863.py | 698 --- PythonEnv/2.7/Lib/encodings/cp863.pyc | Bin 8033 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp864.py | 690 --- PythonEnv/2.7/Lib/encodings/cp864.pyc | Bin 8164 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp865.py | 698 --- PythonEnv/2.7/Lib/encodings/cp865.pyc | Bin 8033 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp866.py | 698 --- PythonEnv/2.7/Lib/encodings/cp866.pyc | Bin 8268 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp869.py | 689 --- PythonEnv/2.7/Lib/encodings/cp869.pyc | Bin 8080 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp874.py | 307 -- PythonEnv/2.7/Lib/encodings/cp874.pyc | Bin 2932 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp875.py | 307 -- PythonEnv/2.7/Lib/encodings/cp875.pyc | Bin 2801 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp932.py | 39 - PythonEnv/2.7/Lib/encodings/cp932.pyc | Bin 1743 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp949.py | 39 - PythonEnv/2.7/Lib/encodings/cp949.pyc | Bin 1743 -> 0 bytes PythonEnv/2.7/Lib/encodings/cp950.py | 39 - PythonEnv/2.7/Lib/encodings/cp950.pyc | Bin 1743 -> 0 bytes PythonEnv/2.7/Lib/encodings/euc_jis_2004.py | 39 - PythonEnv/2.7/Lib/encodings/euc_jis_2004.pyc | Bin 1799 -> 0 bytes PythonEnv/2.7/Lib/encodings/euc_jisx0213.py | 39 - PythonEnv/2.7/Lib/encodings/euc_jisx0213.pyc | Bin 1799 -> 0 bytes PythonEnv/2.7/Lib/encodings/euc_jp.py | 39 - PythonEnv/2.7/Lib/encodings/euc_jp.pyc | Bin 1751 -> 0 bytes PythonEnv/2.7/Lib/encodings/euc_kr.py | 39 - PythonEnv/2.7/Lib/encodings/euc_kr.pyc | Bin 1751 -> 0 bytes PythonEnv/2.7/Lib/encodings/gb18030.py | 39 - PythonEnv/2.7/Lib/encodings/gb18030.pyc | Bin 1759 -> 0 bytes PythonEnv/2.7/Lib/encodings/gb2312.py | 39 - PythonEnv/2.7/Lib/encodings/gb2312.pyc | Bin 1751 -> 0 bytes PythonEnv/2.7/Lib/encodings/gbk.py | 39 - PythonEnv/2.7/Lib/encodings/gbk.pyc | Bin 1727 -> 0 bytes PythonEnv/2.7/Lib/encodings/gbk.pyo | Bin 1727 -> 0 bytes PythonEnv/2.7/Lib/encodings/hex_codec.py | 79 - PythonEnv/2.7/Lib/encodings/hex_codec.pyc | Bin 3715 -> 0 bytes PythonEnv/2.7/Lib/encodings/hp_roman8.py | 152 - PythonEnv/2.7/Lib/encodings/hp_roman8.pyc | Bin 4087 -> 0 bytes PythonEnv/2.7/Lib/encodings/hz.py | 39 - PythonEnv/2.7/Lib/encodings/hz.pyc | Bin 1719 -> 0 bytes PythonEnv/2.7/Lib/encodings/idna.py | 288 -- PythonEnv/2.7/Lib/encodings/idna.pyc | Bin 6334 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso2022_jp.py | 39 - PythonEnv/2.7/Lib/encodings/iso2022_jp.pyc | Bin 1788 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso2022_jp_1.py | 39 - PythonEnv/2.7/Lib/encodings/iso2022_jp_1.pyc | Bin 1804 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso2022_jp_2.py | 39 - PythonEnv/2.7/Lib/encodings/iso2022_jp_2.pyc | Bin 1804 -> 0 bytes .../2.7/Lib/encodings/iso2022_jp_2004.py | 39 - .../2.7/Lib/encodings/iso2022_jp_2004.pyc | Bin 1828 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso2022_jp_3.py | 39 - PythonEnv/2.7/Lib/encodings/iso2022_jp_3.pyc | Bin 1804 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso2022_jp_ext.py | 39 - .../2.7/Lib/encodings/iso2022_jp_ext.pyc | Bin 1820 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso2022_kr.py | 39 - PythonEnv/2.7/Lib/encodings/iso2022_kr.pyc | Bin 1788 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso8859_1.py | 307 -- PythonEnv/2.7/Lib/encodings/iso8859_1.pyc | Bin 2843 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso8859_10.py | 307 -- PythonEnv/2.7/Lib/encodings/iso8859_10.pyc | Bin 2858 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso8859_11.py | 307 -- PythonEnv/2.7/Lib/encodings/iso8859_11.pyc | Bin 2952 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso8859_13.py | 307 -- PythonEnv/2.7/Lib/encodings/iso8859_13.pyc | Bin 2861 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso8859_14.py | 307 -- PythonEnv/2.7/Lib/encodings/iso8859_14.pyc | Bin 2879 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso8859_15.py | 307 -- PythonEnv/2.7/Lib/encodings/iso8859_15.pyc | Bin 2858 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso8859_16.py | 307 -- PythonEnv/2.7/Lib/encodings/iso8859_16.pyc | Bin 2860 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso8859_2.py | 307 -- PythonEnv/2.7/Lib/encodings/iso8859_2.pyc | Bin 2843 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso8859_3.py | 307 -- PythonEnv/2.7/Lib/encodings/iso8859_3.pyc | Bin 2850 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso8859_4.py | 307 -- PythonEnv/2.7/Lib/encodings/iso8859_4.pyc | Bin 2843 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso8859_5.py | 307 -- PythonEnv/2.7/Lib/encodings/iso8859_5.pyc | Bin 2844 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso8859_6.py | 307 -- PythonEnv/2.7/Lib/encodings/iso8859_6.pyc | Bin 2888 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso8859_7.py | 307 -- PythonEnv/2.7/Lib/encodings/iso8859_7.pyc | Bin 2851 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso8859_8.py | 307 -- PythonEnv/2.7/Lib/encodings/iso8859_8.pyc | Bin 2882 -> 0 bytes PythonEnv/2.7/Lib/encodings/iso8859_9.py | 307 -- PythonEnv/2.7/Lib/encodings/iso8859_9.pyc | Bin 2843 -> 0 bytes PythonEnv/2.7/Lib/encodings/johab.py | 39 - PythonEnv/2.7/Lib/encodings/johab.pyc | Bin 1743 -> 0 bytes PythonEnv/2.7/Lib/encodings/koi8_r.py | 307 -- PythonEnv/2.7/Lib/encodings/koi8_r.pyc | Bin 2865 -> 0 bytes PythonEnv/2.7/Lib/encodings/koi8_u.py | 307 -- PythonEnv/2.7/Lib/encodings/koi8_u.pyc | Bin 2851 -> 0 bytes PythonEnv/2.7/Lib/encodings/latin_1.py | 50 - PythonEnv/2.7/Lib/encodings/latin_1.pyc | Bin 2261 -> 0 bytes PythonEnv/2.7/Lib/encodings/mac_arabic.py | 698 --- PythonEnv/2.7/Lib/encodings/mac_arabic.pyc | Bin 7989 -> 0 bytes PythonEnv/2.7/Lib/encodings/mac_centeuro.py | 307 -- PythonEnv/2.7/Lib/encodings/mac_centeuro.pyc | Bin 2912 -> 0 bytes PythonEnv/2.7/Lib/encodings/mac_croatian.py | 307 -- PythonEnv/2.7/Lib/encodings/mac_croatian.pyc | Bin 2920 -> 0 bytes PythonEnv/2.7/Lib/encodings/mac_cyrillic.py | 307 -- PythonEnv/2.7/Lib/encodings/mac_cyrillic.pyc | Bin 2910 -> 0 bytes PythonEnv/2.7/Lib/encodings/mac_farsi.py | 307 -- PythonEnv/2.7/Lib/encodings/mac_farsi.pyc | Bin 2824 -> 0 bytes PythonEnv/2.7/Lib/encodings/mac_greek.py | 307 -- PythonEnv/2.7/Lib/encodings/mac_greek.pyc | Bin 2864 -> 0 bytes PythonEnv/2.7/Lib/encodings/mac_iceland.py | 307 -- PythonEnv/2.7/Lib/encodings/mac_iceland.pyc | Bin 2903 -> 0 bytes PythonEnv/2.7/Lib/encodings/mac_latin2.py | 183 - PythonEnv/2.7/Lib/encodings/mac_latin2.pyc | Bin 4882 -> 0 bytes PythonEnv/2.7/Lib/encodings/mac_roman.py | 307 -- PythonEnv/2.7/Lib/encodings/mac_roman.pyc | Bin 2881 -> 0 bytes PythonEnv/2.7/Lib/encodings/mac_romanian.py | 307 -- PythonEnv/2.7/Lib/encodings/mac_romanian.pyc | Bin 2921 -> 0 bytes PythonEnv/2.7/Lib/encodings/mac_turkish.py | 307 -- PythonEnv/2.7/Lib/encodings/mac_turkish.pyc | Bin 2904 -> 0 bytes PythonEnv/2.7/Lib/encodings/mbcs.py | 47 - PythonEnv/2.7/Lib/encodings/mbcs.pyc | Bin 2003 -> 0 bytes PythonEnv/2.7/Lib/encodings/palmos.py | 83 - PythonEnv/2.7/Lib/encodings/palmos.pyc | Bin 3041 -> 0 bytes PythonEnv/2.7/Lib/encodings/ptcp154.py | 175 - PythonEnv/2.7/Lib/encodings/ptcp154.pyc | Bin 4865 -> 0 bytes PythonEnv/2.7/Lib/encodings/punycode.py | 238 - PythonEnv/2.7/Lib/encodings/punycode.pyc | Bin 7915 -> 0 bytes PythonEnv/2.7/Lib/encodings/quopri_codec.py | 75 - PythonEnv/2.7/Lib/encodings/quopri_codec.pyc | Bin 3560 -> 0 bytes .../2.7/Lib/encodings/raw_unicode_escape.py | 45 - .../2.7/Lib/encodings/raw_unicode_escape.pyc | Bin 2183 -> 0 bytes PythonEnv/2.7/Lib/encodings/rot_13.py | 118 - PythonEnv/2.7/Lib/encodings/rot_13.pyc | Bin 3593 -> 0 bytes PythonEnv/2.7/Lib/encodings/shift_jis.py | 39 - PythonEnv/2.7/Lib/encodings/shift_jis.pyc | Bin 1775 -> 0 bytes PythonEnv/2.7/Lib/encodings/shift_jis_2004.py | 39 - .../2.7/Lib/encodings/shift_jis_2004.pyc | Bin 1815 -> 0 bytes PythonEnv/2.7/Lib/encodings/shift_jisx0213.py | 39 - .../2.7/Lib/encodings/shift_jisx0213.pyc | Bin 1815 -> 0 bytes PythonEnv/2.7/Lib/encodings/string_escape.py | 38 - PythonEnv/2.7/Lib/encodings/string_escape.pyc | Bin 2042 -> 0 bytes PythonEnv/2.7/Lib/encodings/tis_620.py | 307 -- PythonEnv/2.7/Lib/encodings/tis_620.pyc | Bin 2913 -> 0 bytes PythonEnv/2.7/Lib/encodings/undefined.py | 49 - PythonEnv/2.7/Lib/encodings/undefined.pyc | Bin 2564 -> 0 bytes PythonEnv/2.7/Lib/encodings/unicode_escape.py | 45 - .../2.7/Lib/encodings/unicode_escape.pyc | Bin 2131 -> 0 bytes .../2.7/Lib/encodings/unicode_internal.py | 45 - .../2.7/Lib/encodings/unicode_internal.pyc | Bin 2157 -> 0 bytes PythonEnv/2.7/Lib/encodings/utf_16.py | 126 - PythonEnv/2.7/Lib/encodings/utf_16.pyc | Bin 5108 -> 0 bytes PythonEnv/2.7/Lib/encodings/utf_16_be.py | 42 - PythonEnv/2.7/Lib/encodings/utf_16_be.pyc | Bin 1974 -> 0 bytes PythonEnv/2.7/Lib/encodings/utf_16_le.py | 42 - PythonEnv/2.7/Lib/encodings/utf_16_le.pyc | Bin 1974 -> 0 bytes PythonEnv/2.7/Lib/encodings/utf_32.py | 150 - PythonEnv/2.7/Lib/encodings/utf_32.pyc | Bin 5666 -> 0 bytes PythonEnv/2.7/Lib/encodings/utf_32_be.py | 37 - PythonEnv/2.7/Lib/encodings/utf_32_be.pyc | Bin 1867 -> 0 bytes PythonEnv/2.7/Lib/encodings/utf_32_le.py | 37 - PythonEnv/2.7/Lib/encodings/utf_32_le.pyc | Bin 1867 -> 0 bytes PythonEnv/2.7/Lib/encodings/utf_7.py | 38 - PythonEnv/2.7/Lib/encodings/utf_7.pyc | Bin 1867 -> 0 bytes PythonEnv/2.7/Lib/encodings/utf_8.py | 42 - PythonEnv/2.7/Lib/encodings/utf_8.pyc | Bin 1926 -> 0 bytes PythonEnv/2.7/Lib/encodings/utf_8_sig.py | 117 - PythonEnv/2.7/Lib/encodings/utf_8_sig.pyc | Bin 4925 -> 0 bytes PythonEnv/2.7/Lib/encodings/uu_codec.py | 129 - PythonEnv/2.7/Lib/encodings/uu_codec.pyc | Bin 4841 -> 0 bytes PythonEnv/2.7/Lib/encodings/zlib_codec.py | 102 - PythonEnv/2.7/Lib/encodings/zlib_codec.pyc | Bin 4563 -> 0 bytes PythonEnv/2.7/Lib/fnmatch.py | 116 - PythonEnv/2.7/Lib/fnmatch.pyc | Bin 3756 -> 0 bytes PythonEnv/2.7/Lib/genericpath.py | 105 - PythonEnv/2.7/Lib/genericpath.pyc | Bin 3633 -> 0 bytes PythonEnv/2.7/Lib/linecache.py | 135 - PythonEnv/2.7/Lib/linecache.pyc | Bin 3433 -> 0 bytes PythonEnv/2.7/Lib/locale.py | 1882 -------- PythonEnv/2.7/Lib/locale.pyc | Bin 51088 -> 0 bytes PythonEnv/2.7/Lib/no-global-site-packages.txt | 0 PythonEnv/2.7/Lib/ntpath.py | 533 --- PythonEnv/2.7/Lib/ntpath.pyc | Bin 12621 -> 0 bytes PythonEnv/2.7/Lib/orig-prefix.txt | 1 - PythonEnv/2.7/Lib/os.py | 740 ---- PythonEnv/2.7/Lib/os.pyc | Bin 27518 -> 0 bytes PythonEnv/2.7/Lib/posixpath.py | 431 -- PythonEnv/2.7/Lib/posixpath.pyc | Bin 12185 -> 0 bytes PythonEnv/2.7/Lib/re.py | 324 -- PythonEnv/2.7/Lib/re.pyc | Bin 13871 -> 0 bytes .../Lib/site-packages/_markerlib/__init__.py | 16 - .../Lib/site-packages/_markerlib/__init__.pyc | Bin 1292 -> 0 bytes .../Lib/site-packages/_markerlib/markers.py | 119 - .../Lib/site-packages/_markerlib/markers.pyc | Bin 5570 -> 0 bytes .../2.7/Lib/site-packages/easy_install.py | 5 - .../2.7/Lib/site-packages/easy_install.pyc | Bin 354 -> 0 bytes .../pip-1.4.1-py2.7.egg-info/PKG-INFO | 87 - .../pip-1.4.1-py2.7.egg-info/SOURCES.txt | 116 - .../dependency_links.txt | 1 - .../pip-1.4.1-py2.7.egg-info/entry_points.txt | 4 - .../pip-1.4.1-py2.7.egg-info/not-zip-safe | 1 - .../pip-1.4.1-py2.7.egg-info/requires.txt | 7 - .../pip-1.4.1-py2.7.egg-info/top_level.txt | 1 - .../2.7/Lib/site-packages/pip/__init__.py | 235 - .../2.7/Lib/site-packages/pip/__init__.pyc | Bin 8247 -> 0 bytes .../2.7/Lib/site-packages/pip/__main__.py | 7 - .../2.7/Lib/site-packages/pip/__main__.pyc | Bin 340 -> 0 bytes .../pip/backwardcompat/__init__.py | 125 - .../pip/backwardcompat/__init__.pyc | Bin 5529 -> 0 bytes .../pip/backwardcompat/ssl_match_hostname.py | 68 - .../pip/backwardcompat/ssl_match_hostname.pyc | Bin 2610 -> 0 bytes .../2.7/Lib/site-packages/pip/basecommand.py | 207 - .../2.7/Lib/site-packages/pip/basecommand.pyc | Bin 7170 -> 0 bytes .../2.7/Lib/site-packages/pip/baseparser.py | 368 -- .../2.7/Lib/site-packages/pip/baseparser.pyc | Bin 13258 -> 0 bytes .../2.7/Lib/site-packages/pip/cacert.pem | 3895 ----------------- .../2.7/Lib/site-packages/pip/cmdoptions.py | 190 - .../2.7/Lib/site-packages/pip/cmdoptions.pyc | Bin 4780 -> 0 bytes .../site-packages/pip/commands/__init__.py | 88 - .../site-packages/pip/commands/__init__.pyc | Bin 2808 -> 0 bytes .../Lib/site-packages/pip/commands/bundle.py | 53 - .../Lib/site-packages/pip/commands/bundle.pyc | Bin 2755 -> 0 bytes .../site-packages/pip/commands/completion.py | 59 - .../site-packages/pip/commands/completion.pyc | Bin 2537 -> 0 bytes .../Lib/site-packages/pip/commands/freeze.py | 113 - .../Lib/site-packages/pip/commands/freeze.pyc | Bin 4705 -> 0 bytes .../Lib/site-packages/pip/commands/help.py | 33 - .../Lib/site-packages/pip/commands/help.pyc | Bin 1428 -> 0 bytes .../Lib/site-packages/pip/commands/install.py | 271 -- .../site-packages/pip/commands/install.pyc | Bin 8887 -> 0 bytes .../Lib/site-packages/pip/commands/list.py | 147 - .../Lib/site-packages/pip/commands/list.pyc | Bin 6463 -> 0 bytes .../Lib/site-packages/pip/commands/search.py | 130 - .../Lib/site-packages/pip/commands/search.pyc | Bin 5726 -> 0 bytes .../Lib/site-packages/pip/commands/show.py | 79 - .../Lib/site-packages/pip/commands/show.pyc | Bin 3547 -> 0 bytes .../site-packages/pip/commands/uninstall.py | 54 - .../site-packages/pip/commands/uninstall.pyc | Bin 2743 -> 0 bytes .../Lib/site-packages/pip/commands/unzip.py | 7 - .../Lib/site-packages/pip/commands/unzip.pyc | Bin 586 -> 0 bytes .../Lib/site-packages/pip/commands/wheel.py | 158 - .../Lib/site-packages/pip/commands/wheel.pyc | Bin 5527 -> 0 bytes .../2.7/Lib/site-packages/pip/commands/zip.py | 348 -- .../Lib/site-packages/pip/commands/zip.pyc | Bin 12107 -> 0 bytes .../2.7/Lib/site-packages/pip/download.py | 653 --- .../2.7/Lib/site-packages/pip/download.pyc | Bin 23806 -> 0 bytes .../2.7/Lib/site-packages/pip/exceptions.py | 38 - .../2.7/Lib/site-packages/pip/exceptions.pyc | Bin 2880 -> 0 bytes PythonEnv/2.7/Lib/site-packages/pip/index.py | 1041 ----- PythonEnv/2.7/Lib/site-packages/pip/index.pyc | Bin 37796 -> 0 bytes .../2.7/Lib/site-packages/pip/locations.py | 156 - .../2.7/Lib/site-packages/pip/locations.pyc | Bin 5460 -> 0 bytes PythonEnv/2.7/Lib/site-packages/pip/log.py | 187 - PythonEnv/2.7/Lib/site-packages/pip/log.pyc | Bin 7579 -> 0 bytes .../2.7/Lib/site-packages/pip/pep425tags.py | 102 - .../2.7/Lib/site-packages/pip/pep425tags.pyc | Bin 3346 -> 0 bytes PythonEnv/2.7/Lib/site-packages/pip/req.py | 1734 -------- PythonEnv/2.7/Lib/site-packages/pip/req.pyc | Bin 60020 -> 0 bytes PythonEnv/2.7/Lib/site-packages/pip/runner.py | 18 - .../2.7/Lib/site-packages/pip/runner.pyc | Bin 677 -> 0 bytes .../2.7/Lib/site-packages/pip/status_codes.py | 5 - .../Lib/site-packages/pip/status_codes.pyc | Bin 327 -> 0 bytes PythonEnv/2.7/Lib/site-packages/pip/util.py | 693 --- PythonEnv/2.7/Lib/site-packages/pip/util.pyc | Bin 26305 -> 0 bytes .../2.7/Lib/site-packages/pip/vcs/__init__.py | 251 -- .../Lib/site-packages/pip/vcs/__init__.pyc | Bin 11818 -> 0 bytes .../2.7/Lib/site-packages/pip/vcs/bazaar.py | 131 - .../2.7/Lib/site-packages/pip/vcs/bazaar.pyc | Bin 6339 -> 0 bytes .../2.7/Lib/site-packages/pip/vcs/git.py | 194 - .../2.7/Lib/site-packages/pip/vcs/git.pyc | Bin 8737 -> 0 bytes .../Lib/site-packages/pip/vcs/mercurial.py | 151 - .../Lib/site-packages/pip/vcs/mercurial.pyc | Bin 7095 -> 0 bytes .../Lib/site-packages/pip/vcs/subversion.py | 273 -- .../Lib/site-packages/pip/vcs/subversion.pyc | Bin 10698 -> 0 bytes .../Lib/site-packages/pip/vendor/__init__.py | 8 - .../Lib/site-packages/pip/vendor/__init__.pyc | Bin 490 -> 0 bytes .../pip/vendor/distlib/__init__.py | 22 - .../pip/vendor/distlib/__init__.pyc | Bin 1338 -> 0 bytes .../pip/vendor/distlib/_backport/__init__.py | 6 - .../pip/vendor/distlib/_backport/__init__.pyc | Bin 489 -> 0 bytes .../pip/vendor/distlib/_backport/misc.py | 41 - .../pip/vendor/distlib/_backport/misc.pyc | Bin 1580 -> 0 bytes .../pip/vendor/distlib/_backport/shutil.py | 761 ---- .../pip/vendor/distlib/_backport/shutil.pyc | Bin 28060 -> 0 bytes .../pip/vendor/distlib/_backport/sysconfig.py | 787 ---- .../vendor/distlib/_backport/sysconfig.pyc | Bin 22090 -> 0 bytes .../pip/vendor/distlib/_backport/tarfile.py | 2607 ----------- .../pip/vendor/distlib/_backport/tarfile.pyc | Bin 85592 -> 0 bytes .../pip/vendor/distlib/compat.py | 754 ---- .../pip/vendor/distlib/compat.pyc | Bin 31683 -> 0 bytes .../pip/vendor/distlib/database.py | 1301 ------ .../pip/vendor/distlib/database.pyc | Bin 52143 -> 0 bytes .../site-packages/pip/vendor/distlib/index.py | 515 --- .../pip/vendor/distlib/index.pyc | Bin 21368 -> 0 bytes .../pip/vendor/distlib/locators.py | 1131 ----- .../pip/vendor/distlib/locators.pyc | Bin 45269 -> 0 bytes .../pip/vendor/distlib/manifest.py | 361 -- .../pip/vendor/distlib/manifest.pyc | Bin 12454 -> 0 bytes .../pip/vendor/distlib/markers.py | 189 - .../pip/vendor/distlib/markers.pyc | Bin 9174 -> 0 bytes .../pip/vendor/distlib/metadata.py | 708 --- .../pip/vendor/distlib/metadata.pyc | Bin 27613 -> 0 bytes .../pip/vendor/distlib/resources.py | 304 -- .../pip/vendor/distlib/resources.pyc | Bin 14530 -> 0 bytes .../pip/vendor/distlib/scripts.py | 253 -- .../pip/vendor/distlib/scripts.pyc | Bin 8838 -> 0 bytes .../site-packages/pip/vendor/distlib/util.py | 1313 ------ .../site-packages/pip/vendor/distlib/util.pyc | Bin 51522 -> 0 bytes .../pip/vendor/distlib/version.py | 719 --- .../pip/vendor/distlib/version.pyc | Bin 29953 -> 0 bytes .../site-packages/pip/vendor/distlib/wheel.py | 638 --- .../pip/vendor/distlib/wheel.pyc | Bin 21389 -> 0 bytes .../pip/vendor/html5lib/__init__.py | 23 - .../pip/vendor/html5lib/__init__.pyc | Bin 1135 -> 0 bytes .../pip/vendor/html5lib/constants.py | 3086 ------------- .../pip/vendor/html5lib/constants.pyc | Bin 86306 -> 0 bytes .../pip/vendor/html5lib/filters/__init__.py | 0 .../pip/vendor/html5lib/filters/__init__.pyc | Bin 198 -> 0 bytes .../pip/vendor/html5lib/filters/_base.py | 12 - .../pip/vendor/html5lib/filters/_base.pyc | Bin 1301 -> 0 bytes .../filters/alphabeticalattributes.py | 20 - .../filters/alphabeticalattributes.pyc | Bin 1547 -> 0 bytes .../html5lib/filters/inject_meta_charset.py | 65 - .../html5lib/filters/inject_meta_charset.pyc | Bin 2406 -> 0 bytes .../pip/vendor/html5lib/filters/lint.py | 93 - .../pip/vendor/html5lib/filters/lint.pyc | Bin 3643 -> 0 bytes .../vendor/html5lib/filters/optionaltags.py | 205 - .../vendor/html5lib/filters/optionaltags.pyc | Bin 4616 -> 0 bytes .../pip/vendor/html5lib/filters/sanitizer.py | 12 - .../pip/vendor/html5lib/filters/sanitizer.pyc | Bin 1025 -> 0 bytes .../pip/vendor/html5lib/filters/whitespace.py | 38 - .../vendor/html5lib/filters/whitespace.pyc | Bin 1816 -> 0 bytes .../pip/vendor/html5lib/html5parser.py | 2725 ------------ .../pip/vendor/html5lib/html5parser.pyc | Bin 134117 -> 0 bytes .../pip/vendor/html5lib/ihatexml.py | 285 -- .../pip/vendor/html5lib/ihatexml.pyc | Bin 16158 -> 0 bytes .../pip/vendor/html5lib/inputstream.py | 881 ---- .../pip/vendor/html5lib/inputstream.pyc | Bin 29629 -> 0 bytes .../pip/vendor/html5lib/sanitizer.py | 271 -- .../pip/vendor/html5lib/sanitizer.pyc | Bin 14580 -> 0 bytes .../vendor/html5lib/serializer/__init__.py | 16 - .../vendor/html5lib/serializer/__init__.pyc | Bin 942 -> 0 bytes .../html5lib/serializer/htmlserializer.py | 309 -- .../html5lib/serializer/htmlserializer.pyc | Bin 11408 -> 0 bytes .../pip/vendor/html5lib/tokenizer.py | 1731 -------- .../pip/vendor/html5lib/tokenizer.pyc | Bin 56828 -> 0 bytes .../vendor/html5lib/treebuilders/__init__.py | 76 - .../vendor/html5lib/treebuilders/__init__.pyc | Bin 3457 -> 0 bytes .../pip/vendor/html5lib/treebuilders/_base.py | 377 -- .../vendor/html5lib/treebuilders/_base.pyc | Bin 15572 -> 0 bytes .../pip/vendor/html5lib/treebuilders/dom.py | 290 -- .../pip/vendor/html5lib/treebuilders/dom.pyc | Bin 14622 -> 0 bytes .../pip/vendor/html5lib/treebuilders/etree.py | 337 -- .../vendor/html5lib/treebuilders/etree.pyc | Bin 16360 -> 0 bytes .../html5lib/treebuilders/etree_lxml.py | 369 -- .../html5lib/treebuilders/etree_lxml.pyc | Bin 16624 -> 0 bytes .../vendor/html5lib/treewalkers/__init__.py | 57 - .../vendor/html5lib/treewalkers/__init__.pyc | Bin 2548 -> 0 bytes .../pip/vendor/html5lib/treewalkers/_base.py | 196 - .../pip/vendor/html5lib/treewalkers/_base.pyc | Bin 9344 -> 0 bytes .../pip/vendor/html5lib/treewalkers/dom.py | 46 - .../pip/vendor/html5lib/treewalkers/dom.pyc | Bin 2507 -> 0 bytes .../pip/vendor/html5lib/treewalkers/etree.py | 131 - .../pip/vendor/html5lib/treewalkers/etree.pyc | Bin 4626 -> 0 bytes .../html5lib/treewalkers/genshistream.py | 69 - .../html5lib/treewalkers/genshistream.pyc | Bin 2601 -> 0 bytes .../vendor/html5lib/treewalkers/lxmletree.py | 208 - .../vendor/html5lib/treewalkers/lxmletree.pyc | Bin 10348 -> 0 bytes .../vendor/html5lib/treewalkers/pulldom.py | 63 - .../vendor/html5lib/treewalkers/pulldom.pyc | Bin 2520 -> 0 bytes .../pip/vendor/html5lib/trie/__init__.py | 12 - .../pip/vendor/html5lib/trie/__init__.pyc | Bin 479 -> 0 bytes .../pip/vendor/html5lib/trie/_base.py | 37 - .../pip/vendor/html5lib/trie/_base.pyc | Bin 1973 -> 0 bytes .../pip/vendor/html5lib/trie/datrie.py | 44 - .../pip/vendor/html5lib/trie/datrie.pyc | Bin 3185 -> 0 bytes .../pip/vendor/html5lib/trie/py.py | 67 - .../pip/vendor/html5lib/trie/py.pyc | Bin 3388 -> 0 bytes .../pip/vendor/html5lib/utils.py | 78 - .../pip/vendor/html5lib/utils.pyc | Bin 3434 -> 0 bytes .../2.7/Lib/site-packages/pip/vendor/six.py | 404 -- .../2.7/Lib/site-packages/pip/vendor/six.pyc | Bin 15686 -> 0 bytes PythonEnv/2.7/Lib/site-packages/pip/wheel.py | 335 -- PythonEnv/2.7/Lib/site-packages/pip/wheel.pyc | Bin 14032 -> 0 bytes .../2.7/Lib/site-packages/pkg_resources.py | 3029 ------------- .../2.7/Lib/site-packages/pkg_resources.pyc | Bin 118433 -> 0 bytes .../setuptools-0.9.8-py2.7.egg-info/PKG-INFO | 960 ---- .../SOURCES.txt | 132 - .../dependency_links.txt | 6 - .../entry_points.txt | 62 - .../entry_points.txt.orig | 62 - .../requires.txt | 13 - .../top_level.txt | 4 - .../setuptools-0.9.8-py2.7.egg-info/zip-safe | 1 - .../Lib/site-packages/setuptools/__init__.py | 94 - .../Lib/site-packages/setuptools/__init__.pyc | Bin 4216 -> 0 bytes .../setuptools/_backport/__init__.py | 0 .../setuptools/_backport/__init__.pyc | Bin 191 -> 0 bytes .../setuptools/_backport/hashlib/__init__.py | 146 - .../setuptools/_backport/hashlib/__init__.pyc | Bin 4847 -> 0 bytes .../setuptools/_backport/hashlib/_sha.py | 359 -- .../setuptools/_backport/hashlib/_sha.pyc | Bin 9874 -> 0 bytes .../setuptools/_backport/hashlib/_sha256.py | 260 -- .../setuptools/_backport/hashlib/_sha256.pyc | Bin 16462 -> 0 bytes .../setuptools/_backport/hashlib/_sha512.py | 288 -- .../setuptools/_backport/hashlib/_sha512.pyc | Bin 19417 -> 0 bytes .../site-packages/setuptools/archive_util.py | 210 - .../site-packages/setuptools/archive_util.pyc | Bin 6449 -> 0 bytes .../Lib/site-packages/setuptools/cli-32.exe | Bin 65536 -> 0 bytes .../Lib/site-packages/setuptools/cli-64.exe | Bin 74752 -> 0 bytes .../site-packages/setuptools/cli-arm-32.exe | Bin 69120 -> 0 bytes .../2.7/Lib/site-packages/setuptools/cli.exe | Bin 65536 -> 0 bytes .../setuptools/command/__init__.py | 21 - .../setuptools/command/__init__.pyc | Bin 959 -> 0 bytes .../site-packages/setuptools/command/alias.py | 82 - .../setuptools/command/alias.pyc | Bin 3504 -> 0 bytes .../setuptools/command/bdist_egg.py | 553 --- .../setuptools/command/bdist_egg.pyc | Bin 19633 -> 0 bytes .../setuptools/command/bdist_rpm.py | 82 - .../setuptools/command/bdist_rpm.pyc | Bin 2527 -> 0 bytes .../setuptools/command/bdist_wininst.py | 82 - .../setuptools/command/bdist_wininst.pyc | Bin 2671 -> 0 bytes .../setuptools/command/build_ext.py | 298 -- .../setuptools/command/build_ext.pyc | Bin 10990 -> 0 bytes .../setuptools/command/build_py.py | 280 -- .../setuptools/command/build_py.pyc | Bin 12692 -> 0 bytes .../setuptools/command/develop.py | 167 - .../setuptools/command/develop.pyc | Bin 6131 -> 0 bytes .../setuptools/command/easy_install.py | 2002 --------- .../setuptools/command/easy_install.pyc | Bin 71108 -> 0 bytes .../setuptools/command/egg_info.py | 489 --- .../setuptools/command/egg_info.pyc | Bin 18970 -> 0 bytes .../setuptools/command/install.py | 124 - .../setuptools/command/install.pyc | Bin 4114 -> 0 bytes .../setuptools/command/install_egg_info.py | 125 - .../setuptools/command/install_egg_info.pyc | Bin 5057 -> 0 bytes .../setuptools/command/install_lib.py | 82 - .../setuptools/command/install_lib.pyc | Bin 3532 -> 0 bytes .../setuptools/command/install_scripts.py | 54 - .../setuptools/command/install_scripts.pyc | Bin 2796 -> 0 bytes .../setuptools/command/launcher manifest.xml | 15 - .../setuptools/command/register.py | 10 - .../setuptools/command/register.pyc | Bin 809 -> 0 bytes .../setuptools/command/rotate.py | 83 - .../setuptools/command/rotate.pyc | Bin 3146 -> 0 bytes .../setuptools/command/saveopts.py | 24 - .../setuptools/command/saveopts.pyc | Bin 1348 -> 0 bytes .../site-packages/setuptools/command/sdist.py | 304 -- .../setuptools/command/sdist.pyc | Bin 10827 -> 0 bytes .../setuptools/command/setopt.py | 164 - .../setuptools/command/setopt.pyc | Bin 6440 -> 0 bytes .../site-packages/setuptools/command/test.py | 198 - .../site-packages/setuptools/command/test.pyc | Bin 6289 -> 0 bytes .../setuptools/command/upload.py | 184 - .../setuptools/command/upload.pyc | Bin 6669 -> 0 bytes .../setuptools/command/upload_docs.py | 203 - .../setuptools/command/upload_docs.pyc | Bin 7529 -> 0 bytes .../Lib/site-packages/setuptools/compat.py | 97 - .../Lib/site-packages/setuptools/compat.pyc | Bin 5090 -> 0 bytes .../Lib/site-packages/setuptools/depends.py | 246 -- .../Lib/site-packages/setuptools/depends.pyc | Bin 7233 -> 0 bytes .../2.7/Lib/site-packages/setuptools/dist.py | 892 ---- .../2.7/Lib/site-packages/setuptools/dist.pyc | Bin 33320 -> 0 bytes .../Lib/site-packages/setuptools/extension.py | 46 - .../site-packages/setuptools/extension.pyc | Bin 2585 -> 0 bytes .../Lib/site-packages/setuptools/gui-32.exe | Bin 65536 -> 0 bytes .../Lib/site-packages/setuptools/gui-64.exe | Bin 75264 -> 0 bytes .../site-packages/setuptools/gui-arm-32.exe | Bin 69120 -> 0 bytes .../2.7/Lib/site-packages/setuptools/gui.exe | Bin 65536 -> 0 bytes .../site-packages/setuptools/package_index.py | 988 ----- .../setuptools/package_index.pyc | Bin 38296 -> 0 bytes .../site-packages/setuptools/py24compat.py | 17 - .../site-packages/setuptools/py24compat.pyc | Bin 883 -> 0 bytes .../site-packages/setuptools/py27compat.py | 15 - .../site-packages/setuptools/py27compat.pyc | Bin 860 -> 0 bytes .../Lib/site-packages/setuptools/sandbox.py | 324 -- .../Lib/site-packages/setuptools/sandbox.pyc | Bin 13316 -> 0 bytes .../setuptools/script template (dev).py | 9 - .../setuptools/script template (dev).pyc | Bin 488 -> 0 bytes .../setuptools/script template.py | 4 - .../setuptools/script template.pyc | Bin 314 -> 0 bytes .../site-packages/setuptools/site-patch.py | 83 - .../site-packages/setuptools/site-patch.pyc | Bin 1839 -> 0 bytes .../site-packages/setuptools/ssl_support.py | 255 -- .../site-packages/setuptools/ssl_support.pyc | Bin 9114 -> 0 bytes .../setuptools/tests/__init__.py | 352 -- .../setuptools/tests/__init__.pyc | Bin 15315 -> 0 bytes .../site-packages/setuptools/tests/doctest.py | 2683 ------------ .../setuptools/tests/doctest.pyc | Bin 86303 -> 0 bytes .../setuptools/tests/py26compat.py | 14 - .../setuptools/tests/py26compat.pyc | Bin 951 -> 0 bytes .../site-packages/setuptools/tests/server.py | 82 - .../site-packages/setuptools/tests/server.pyc | Bin 4663 -> 0 bytes .../setuptools/tests/test_bdist_egg.py | 69 - .../setuptools/tests/test_bdist_egg.pyc | Bin 3182 -> 0 bytes .../setuptools/tests/test_build_ext.py | 20 - .../setuptools/tests/test_build_ext.pyc | Bin 1267 -> 0 bytes .../setuptools/tests/test_develop.py | 122 - .../setuptools/tests/test_develop.pyc | Bin 4315 -> 0 bytes .../setuptools/tests/test_dist_info.py | 83 - .../setuptools/tests/test_dist_info.pyc | Bin 3740 -> 0 bytes .../setuptools/tests/test_easy_install.py | 426 -- .../setuptools/tests/test_easy_install.pyc | Bin 18379 -> 0 bytes .../setuptools/tests/test_egg_info.py | 40 - .../setuptools/tests/test_egg_info.pyc | Bin 2419 -> 0 bytes .../setuptools/tests/test_markerlib.py | 68 - .../setuptools/tests/test_markerlib.pyc | Bin 3044 -> 0 bytes .../setuptools/tests/test_packageindex.py | 187 - .../setuptools/tests/test_packageindex.pyc | Bin 10016 -> 0 bytes .../setuptools/tests/test_resources.py | 615 --- .../setuptools/tests/test_resources.pyc | Bin 29508 -> 0 bytes .../setuptools/tests/test_sandbox.py | 66 - .../setuptools/tests/test_sandbox.pyc | Bin 3411 -> 0 bytes .../setuptools/tests/test_sdist.py | 400 -- .../setuptools/tests/test_sdist.pyc | Bin 11272 -> 0 bytes .../setuptools/tests/test_test.py | 124 - .../setuptools/tests/test_test.pyc | Bin 4197 -> 0 bytes .../setuptools/tests/test_upload_docs.py | 72 - .../setuptools/tests/test_upload_docs.pyc | Bin 2853 -> 0 bytes PythonEnv/2.7/Lib/site.py | 758 ---- PythonEnv/2.7/Lib/site.pyc | Bin 25343 -> 0 bytes PythonEnv/2.7/Lib/sre.py | 13 - PythonEnv/2.7/Lib/sre_compile.py | 525 --- PythonEnv/2.7/Lib/sre_compile.pyc | Bin 11569 -> 0 bytes PythonEnv/2.7/Lib/sre_constants.py | 259 -- PythonEnv/2.7/Lib/sre_constants.pyc | Bin 6302 -> 0 bytes PythonEnv/2.7/Lib/sre_parse.py | 803 ---- PythonEnv/2.7/Lib/sre_parse.pyc | Bin 20820 -> 0 bytes PythonEnv/2.7/Lib/stat.py | 96 - PythonEnv/2.7/Lib/stat.pyc | Bin 3121 -> 0 bytes PythonEnv/2.7/Lib/types.py | 84 - PythonEnv/2.7/Lib/types.pyc | Bin 2728 -> 0 bytes PythonEnv/2.7/Lib/warnings.py | 400 -- PythonEnv/2.7/Lib/warnings.pyc | Bin 13991 -> 0 bytes PythonEnv/2.7/Scripts/activate | 80 - PythonEnv/2.7/Scripts/activate.bat | 26 - PythonEnv/2.7/Scripts/activate.ps1 | 148 - PythonEnv/2.7/Scripts/activate_this.py | 34 - PythonEnv/2.7/Scripts/deactivate.bat | 20 - .../2.7/Scripts/easy_install-2.7-script.py | 10 - PythonEnv/2.7/Scripts/easy_install-2.7.exe | Bin 74752 -> 0 bytes PythonEnv/2.7/Scripts/easy_install-script.py | 10 - PythonEnv/2.7/Scripts/easy_install.exe | Bin 74752 -> 0 bytes PythonEnv/2.7/Scripts/pip-2.7-script.py | 10 - PythonEnv/2.7/Scripts/pip-2.7.exe | Bin 74752 -> 0 bytes PythonEnv/2.7/Scripts/pip-script.py | 10 - PythonEnv/2.7/Scripts/pip.exe | Bin 74752 -> 0 bytes PythonEnv/2.7/Scripts/python.exe | Bin 27136 -> 0 bytes PythonEnv/2.7/Scripts/pythonw.exe | Bin 27648 -> 0 bytes WinAlfred.Plugin/PluginMetadata.cs | 1 + WinAlfred.Plugin/Result.cs | 5 + WinAlfred.sln | 16 +- WinAlfred/App.config | 20 - WinAlfred/App.xaml | 32 + WinAlfred/App.xaml.cs | 11 + .../ResultItemControl.Designer.cs | 128 - WinAlfred/CustomControls/ResultItemControl.cs | 23 - .../CustomControls/ResultItemControl.resx | 120 - WinAlfred/FrmMain.Designer.cs | 84 - WinAlfred/FrmMain.cs | 89 - WinAlfred/FrmMain.resx | 120 - WinAlfred/Helper/KeyboardHook.cs | 3 +- WinAlfred/Helper/Log.cs | 6 +- WinAlfred/MainWindow.xaml | 19 + WinAlfred/MainWindow.xaml.cs | 123 + WinAlfred/PluginLoader/BasePluginLoader.cs | 1 + WinAlfred/PluginLoader/CSharpPluginLoader.cs | 11 +- WinAlfred/PluginLoader/PythonPluginLoader.cs | 7 +- WinAlfred/PluginLoader/PythonPluginWrapper.cs | 2 - WinAlfred/Program.cs | 21 - WinAlfred/Properties/AssemblyInfo.cs | 28 +- WinAlfred/Properties/Resources.Designer.cs | 54 +- WinAlfred/Properties/Settings.Designer.cs | 28 +- WinAlfred/Properties/Settings.settings | 4 +- WinAlfred/ResultItem.xaml | 25 + WinAlfred/ResultItem.xaml.cs | 42 + WinAlfred/ResultPanel.xaml | 11 + WinAlfred/ResultPanel.xaml.cs | 118 + WinAlfred/WinAlfred.csproj | 114 +- WinAlfred/WinAlfred.idc | 1 - 761 files changed, 569 insertions(+), 112327 deletions(-) create mode 100644 Plugins/WinAlfred.Plugin.System/Images/lock.png delete mode 100644 PythonEnv/2.7/Include/Python-ast.h delete mode 100644 PythonEnv/2.7/Include/Python.h delete mode 100644 PythonEnv/2.7/Include/abstract.h delete mode 100644 PythonEnv/2.7/Include/asdl.h delete mode 100644 PythonEnv/2.7/Include/ast.h delete mode 100644 PythonEnv/2.7/Include/bitset.h delete mode 100644 PythonEnv/2.7/Include/boolobject.h delete mode 100644 PythonEnv/2.7/Include/bufferobject.h delete mode 100644 PythonEnv/2.7/Include/bytearrayobject.h delete mode 100644 PythonEnv/2.7/Include/bytes_methods.h delete mode 100644 PythonEnv/2.7/Include/bytesobject.h delete mode 100644 PythonEnv/2.7/Include/cStringIO.h delete mode 100644 PythonEnv/2.7/Include/cellobject.h delete mode 100644 PythonEnv/2.7/Include/ceval.h delete mode 100644 PythonEnv/2.7/Include/classobject.h delete mode 100644 PythonEnv/2.7/Include/cobject.h delete mode 100644 PythonEnv/2.7/Include/code.h delete mode 100644 PythonEnv/2.7/Include/codecs.h delete mode 100644 PythonEnv/2.7/Include/compile.h delete mode 100644 PythonEnv/2.7/Include/complexobject.h delete mode 100644 PythonEnv/2.7/Include/datetime.h delete mode 100644 PythonEnv/2.7/Include/descrobject.h delete mode 100644 PythonEnv/2.7/Include/dictobject.h delete mode 100644 PythonEnv/2.7/Include/dtoa.h delete mode 100644 PythonEnv/2.7/Include/enumobject.h delete mode 100644 PythonEnv/2.7/Include/errcode.h delete mode 100644 PythonEnv/2.7/Include/eval.h delete mode 100644 PythonEnv/2.7/Include/fileobject.h delete mode 100644 PythonEnv/2.7/Include/floatobject.h delete mode 100644 PythonEnv/2.7/Include/frameobject.h delete mode 100644 PythonEnv/2.7/Include/funcobject.h delete mode 100644 PythonEnv/2.7/Include/genobject.h delete mode 100644 PythonEnv/2.7/Include/graminit.h delete mode 100644 PythonEnv/2.7/Include/grammar.h delete mode 100644 PythonEnv/2.7/Include/import.h delete mode 100644 PythonEnv/2.7/Include/intobject.h delete mode 100644 PythonEnv/2.7/Include/intrcheck.h delete mode 100644 PythonEnv/2.7/Include/iterobject.h delete mode 100644 PythonEnv/2.7/Include/listobject.h delete mode 100644 PythonEnv/2.7/Include/longintrepr.h delete mode 100644 PythonEnv/2.7/Include/longobject.h delete mode 100644 PythonEnv/2.7/Include/marshal.h delete mode 100644 PythonEnv/2.7/Include/memoryobject.h delete mode 100644 PythonEnv/2.7/Include/metagrammar.h delete mode 100644 PythonEnv/2.7/Include/methodobject.h delete mode 100644 PythonEnv/2.7/Include/modsupport.h delete mode 100644 PythonEnv/2.7/Include/moduleobject.h delete mode 100644 PythonEnv/2.7/Include/node.h delete mode 100644 PythonEnv/2.7/Include/object.h delete mode 100644 PythonEnv/2.7/Include/objimpl.h delete mode 100644 PythonEnv/2.7/Include/opcode.h delete mode 100644 PythonEnv/2.7/Include/osdefs.h delete mode 100644 PythonEnv/2.7/Include/parsetok.h delete mode 100644 PythonEnv/2.7/Include/patchlevel.h delete mode 100644 PythonEnv/2.7/Include/pgen.h delete mode 100644 PythonEnv/2.7/Include/pgenheaders.h delete mode 100644 PythonEnv/2.7/Include/py_curses.h delete mode 100644 PythonEnv/2.7/Include/pyarena.h delete mode 100644 PythonEnv/2.7/Include/pycapsule.h delete mode 100644 PythonEnv/2.7/Include/pyconfig.h delete mode 100644 PythonEnv/2.7/Include/pyctype.h delete mode 100644 PythonEnv/2.7/Include/pydebug.h delete mode 100644 PythonEnv/2.7/Include/pyerrors.h delete mode 100644 PythonEnv/2.7/Include/pyexpat.h delete mode 100644 PythonEnv/2.7/Include/pyfpe.h delete mode 100644 PythonEnv/2.7/Include/pygetopt.h delete mode 100644 PythonEnv/2.7/Include/pymacconfig.h delete mode 100644 PythonEnv/2.7/Include/pymactoolbox.h delete mode 100644 PythonEnv/2.7/Include/pymath.h delete mode 100644 PythonEnv/2.7/Include/pymem.h delete mode 100644 PythonEnv/2.7/Include/pyport.h delete mode 100644 PythonEnv/2.7/Include/pystate.h delete mode 100644 PythonEnv/2.7/Include/pystrcmp.h delete mode 100644 PythonEnv/2.7/Include/pystrtod.h delete mode 100644 PythonEnv/2.7/Include/pythonrun.h delete mode 100644 PythonEnv/2.7/Include/pythread.h delete mode 100644 PythonEnv/2.7/Include/rangeobject.h delete mode 100644 PythonEnv/2.7/Include/setobject.h delete mode 100644 PythonEnv/2.7/Include/sliceobject.h delete mode 100644 PythonEnv/2.7/Include/stringobject.h delete mode 100644 PythonEnv/2.7/Include/structmember.h delete mode 100644 PythonEnv/2.7/Include/structseq.h delete mode 100644 PythonEnv/2.7/Include/symtable.h delete mode 100644 PythonEnv/2.7/Include/sysmodule.h delete mode 100644 PythonEnv/2.7/Include/timefuncs.h delete mode 100644 PythonEnv/2.7/Include/token.h delete mode 100644 PythonEnv/2.7/Include/traceback.h delete mode 100644 PythonEnv/2.7/Include/tupleobject.h delete mode 100644 PythonEnv/2.7/Include/ucnhash.h delete mode 100644 PythonEnv/2.7/Include/unicodeobject.h delete mode 100644 PythonEnv/2.7/Include/warnings.h delete mode 100644 PythonEnv/2.7/Include/weakrefobject.h delete mode 100644 PythonEnv/2.7/Lib/UserDict.py delete mode 100644 PythonEnv/2.7/Lib/UserDict.pyc delete mode 100644 PythonEnv/2.7/Lib/_abcoll.py delete mode 100644 PythonEnv/2.7/Lib/_abcoll.pyc delete mode 100644 PythonEnv/2.7/Lib/_weakrefset.py delete mode 100644 PythonEnv/2.7/Lib/_weakrefset.pyc delete mode 100644 PythonEnv/2.7/Lib/abc.py delete mode 100644 PythonEnv/2.7/Lib/abc.pyc delete mode 100644 PythonEnv/2.7/Lib/codecs.py delete mode 100644 PythonEnv/2.7/Lib/codecs.pyc delete mode 100644 PythonEnv/2.7/Lib/copy_reg.py delete mode 100644 PythonEnv/2.7/Lib/copy_reg.pyc delete mode 100644 PythonEnv/2.7/Lib/distutils/__init__.py delete mode 100644 PythonEnv/2.7/Lib/distutils/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/distutils/distutils.cfg delete mode 100644 PythonEnv/2.7/Lib/encodings/__init__.py delete mode 100644 PythonEnv/2.7/Lib/encodings/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/__init__.pyo delete mode 100644 PythonEnv/2.7/Lib/encodings/aliases.py delete mode 100644 PythonEnv/2.7/Lib/encodings/aliases.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/aliases.pyo delete mode 100644 PythonEnv/2.7/Lib/encodings/ascii.py delete mode 100644 PythonEnv/2.7/Lib/encodings/ascii.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/base64_codec.py delete mode 100644 PythonEnv/2.7/Lib/encodings/base64_codec.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/big5.py delete mode 100644 PythonEnv/2.7/Lib/encodings/big5.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/big5hkscs.py delete mode 100644 PythonEnv/2.7/Lib/encodings/big5hkscs.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/bz2_codec.py delete mode 100644 PythonEnv/2.7/Lib/encodings/bz2_codec.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/charmap.py delete mode 100644 PythonEnv/2.7/Lib/encodings/charmap.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp037.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp037.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1006.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1006.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1026.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1026.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1140.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1140.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1250.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1250.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1251.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1251.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1252.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1252.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1253.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1253.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1254.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1254.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1255.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1255.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1256.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1256.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1257.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1257.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1258.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp1258.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp424.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp424.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp437.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp437.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp500.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp500.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp720.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp720.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp737.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp737.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp775.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp775.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp850.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp850.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp852.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp852.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp855.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp855.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp856.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp856.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp857.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp857.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp858.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp858.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp860.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp860.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp861.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp861.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp862.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp862.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp863.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp863.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp864.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp864.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp865.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp865.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp866.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp866.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp869.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp869.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp874.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp874.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp875.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp875.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp932.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp932.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp949.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp949.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/cp950.py delete mode 100644 PythonEnv/2.7/Lib/encodings/cp950.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/euc_jis_2004.py delete mode 100644 PythonEnv/2.7/Lib/encodings/euc_jis_2004.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/euc_jisx0213.py delete mode 100644 PythonEnv/2.7/Lib/encodings/euc_jisx0213.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/euc_jp.py delete mode 100644 PythonEnv/2.7/Lib/encodings/euc_jp.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/euc_kr.py delete mode 100644 PythonEnv/2.7/Lib/encodings/euc_kr.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/gb18030.py delete mode 100644 PythonEnv/2.7/Lib/encodings/gb18030.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/gb2312.py delete mode 100644 PythonEnv/2.7/Lib/encodings/gb2312.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/gbk.py delete mode 100644 PythonEnv/2.7/Lib/encodings/gbk.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/gbk.pyo delete mode 100644 PythonEnv/2.7/Lib/encodings/hex_codec.py delete mode 100644 PythonEnv/2.7/Lib/encodings/hex_codec.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/hp_roman8.py delete mode 100644 PythonEnv/2.7/Lib/encodings/hp_roman8.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/hz.py delete mode 100644 PythonEnv/2.7/Lib/encodings/hz.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/idna.py delete mode 100644 PythonEnv/2.7/Lib/encodings/idna.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_1.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_1.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_2.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_2.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_2004.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_2004.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_3.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_3.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_ext.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_jp_ext.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_kr.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso2022_kr.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_1.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_1.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_10.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_10.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_11.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_11.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_13.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_13.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_14.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_14.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_15.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_15.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_16.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_16.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_2.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_2.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_3.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_3.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_4.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_4.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_5.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_5.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_6.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_6.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_7.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_7.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_8.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_8.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_9.py delete mode 100644 PythonEnv/2.7/Lib/encodings/iso8859_9.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/johab.py delete mode 100644 PythonEnv/2.7/Lib/encodings/johab.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/koi8_r.py delete mode 100644 PythonEnv/2.7/Lib/encodings/koi8_r.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/koi8_u.py delete mode 100644 PythonEnv/2.7/Lib/encodings/koi8_u.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/latin_1.py delete mode 100644 PythonEnv/2.7/Lib/encodings/latin_1.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_arabic.py delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_arabic.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_centeuro.py delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_centeuro.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_croatian.py delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_croatian.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_cyrillic.py delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_cyrillic.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_farsi.py delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_farsi.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_greek.py delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_greek.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_iceland.py delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_iceland.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_latin2.py delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_latin2.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_roman.py delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_roman.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_romanian.py delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_romanian.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_turkish.py delete mode 100644 PythonEnv/2.7/Lib/encodings/mac_turkish.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/mbcs.py delete mode 100644 PythonEnv/2.7/Lib/encodings/mbcs.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/palmos.py delete mode 100644 PythonEnv/2.7/Lib/encodings/palmos.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/ptcp154.py delete mode 100644 PythonEnv/2.7/Lib/encodings/ptcp154.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/punycode.py delete mode 100644 PythonEnv/2.7/Lib/encodings/punycode.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/quopri_codec.py delete mode 100644 PythonEnv/2.7/Lib/encodings/quopri_codec.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/raw_unicode_escape.py delete mode 100644 PythonEnv/2.7/Lib/encodings/raw_unicode_escape.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/rot_13.py delete mode 100644 PythonEnv/2.7/Lib/encodings/rot_13.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/shift_jis.py delete mode 100644 PythonEnv/2.7/Lib/encodings/shift_jis.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/shift_jis_2004.py delete mode 100644 PythonEnv/2.7/Lib/encodings/shift_jis_2004.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/shift_jisx0213.py delete mode 100644 PythonEnv/2.7/Lib/encodings/shift_jisx0213.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/string_escape.py delete mode 100644 PythonEnv/2.7/Lib/encodings/string_escape.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/tis_620.py delete mode 100644 PythonEnv/2.7/Lib/encodings/tis_620.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/undefined.py delete mode 100644 PythonEnv/2.7/Lib/encodings/undefined.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/unicode_escape.py delete mode 100644 PythonEnv/2.7/Lib/encodings/unicode_escape.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/unicode_internal.py delete mode 100644 PythonEnv/2.7/Lib/encodings/unicode_internal.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/utf_16.py delete mode 100644 PythonEnv/2.7/Lib/encodings/utf_16.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/utf_16_be.py delete mode 100644 PythonEnv/2.7/Lib/encodings/utf_16_be.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/utf_16_le.py delete mode 100644 PythonEnv/2.7/Lib/encodings/utf_16_le.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/utf_32.py delete mode 100644 PythonEnv/2.7/Lib/encodings/utf_32.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/utf_32_be.py delete mode 100644 PythonEnv/2.7/Lib/encodings/utf_32_be.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/utf_32_le.py delete mode 100644 PythonEnv/2.7/Lib/encodings/utf_32_le.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/utf_7.py delete mode 100644 PythonEnv/2.7/Lib/encodings/utf_7.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/utf_8.py delete mode 100644 PythonEnv/2.7/Lib/encodings/utf_8.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/utf_8_sig.py delete mode 100644 PythonEnv/2.7/Lib/encodings/utf_8_sig.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/uu_codec.py delete mode 100644 PythonEnv/2.7/Lib/encodings/uu_codec.pyc delete mode 100644 PythonEnv/2.7/Lib/encodings/zlib_codec.py delete mode 100644 PythonEnv/2.7/Lib/encodings/zlib_codec.pyc delete mode 100644 PythonEnv/2.7/Lib/fnmatch.py delete mode 100644 PythonEnv/2.7/Lib/fnmatch.pyc delete mode 100644 PythonEnv/2.7/Lib/genericpath.py delete mode 100644 PythonEnv/2.7/Lib/genericpath.pyc delete mode 100644 PythonEnv/2.7/Lib/linecache.py delete mode 100644 PythonEnv/2.7/Lib/linecache.pyc delete mode 100644 PythonEnv/2.7/Lib/locale.py delete mode 100644 PythonEnv/2.7/Lib/locale.pyc delete mode 100644 PythonEnv/2.7/Lib/no-global-site-packages.txt delete mode 100644 PythonEnv/2.7/Lib/ntpath.py delete mode 100644 PythonEnv/2.7/Lib/ntpath.pyc delete mode 100644 PythonEnv/2.7/Lib/orig-prefix.txt delete mode 100644 PythonEnv/2.7/Lib/os.py delete mode 100644 PythonEnv/2.7/Lib/os.pyc delete mode 100644 PythonEnv/2.7/Lib/posixpath.py delete mode 100644 PythonEnv/2.7/Lib/posixpath.pyc delete mode 100644 PythonEnv/2.7/Lib/re.py delete mode 100644 PythonEnv/2.7/Lib/re.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/_markerlib/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/_markerlib/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/_markerlib/markers.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/_markerlib/markers.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/easy_install.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/easy_install.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/PKG-INFO delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/SOURCES.txt delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/dependency_links.txt delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/entry_points.txt delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/not-zip-safe delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/requires.txt delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/top_level.txt delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/__main__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/__main__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/ssl_match_hostname.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/ssl_match_hostname.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/basecommand.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/basecommand.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/baseparser.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/baseparser.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/cacert.pem delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/cmdoptions.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/cmdoptions.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/bundle.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/bundle.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/completion.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/completion.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/freeze.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/freeze.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/help.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/help.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/install.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/install.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/list.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/list.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/search.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/search.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/show.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/show.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/uninstall.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/uninstall.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/unzip.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/unzip.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/wheel.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/wheel.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/zip.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/commands/zip.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/download.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/download.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/exceptions.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/exceptions.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/index.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/index.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/locations.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/locations.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/log.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/log.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/pep425tags.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/pep425tags.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/req.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/req.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/runner.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/runner.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/status_codes.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/status_codes.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/util.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/util.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/bazaar.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/bazaar.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/git.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/git.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/mercurial.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/mercurial.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/subversion.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vcs/subversion.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/misc.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/misc.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/shutil.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/shutil.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/sysconfig.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/sysconfig.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/tarfile.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/tarfile.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/compat.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/compat.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/database.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/database.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/index.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/index.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/locators.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/locators.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/manifest.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/manifest.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/markers.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/markers.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/metadata.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/metadata.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/resources.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/resources.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/scripts.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/scripts.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/util.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/util.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/version.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/version.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/wheel.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/wheel.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/constants.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/constants.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/_base.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/_base.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/alphabeticalattributes.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/alphabeticalattributes.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/inject_meta_charset.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/inject_meta_charset.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/lint.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/lint.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/optionaltags.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/optionaltags.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/sanitizer.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/sanitizer.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/whitespace.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/whitespace.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/html5parser.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/html5parser.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/ihatexml.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/ihatexml.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/inputstream.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/inputstream.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/sanitizer.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/sanitizer.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/htmlserializer.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/htmlserializer.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/tokenizer.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/tokenizer.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/_base.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/_base.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/dom.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/dom.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree_lxml.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree_lxml.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/_base.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/_base.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/dom.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/dom.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/etree.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/etree.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/genshistream.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/genshistream.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/lxmletree.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/lxmletree.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/pulldom.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/pulldom.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/_base.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/_base.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/datrie.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/datrie.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/py.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/py.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/utils.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/utils.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/six.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/vendor/six.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/wheel.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pip/wheel.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/pkg_resources.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/pkg_resources.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/PKG-INFO delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/SOURCES.txt delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/dependency_links.txt delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/entry_points.txt delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/entry_points.txt.orig delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/requires.txt delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/top_level.txt delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/zip-safe delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha256.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha256.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha512.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha512.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/archive_util.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/archive_util.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/cli-32.exe delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/cli-64.exe delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/cli-arm-32.exe delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/cli.exe delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/alias.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/alias.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_egg.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_egg.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_rpm.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_rpm.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_wininst.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_wininst.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/build_ext.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/build_ext.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/build_py.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/build_py.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/develop.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/develop.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/easy_install.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/easy_install.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/egg_info.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/egg_info.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/install.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/install.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/install_egg_info.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/install_egg_info.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/install_lib.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/install_lib.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/install_scripts.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/install_scripts.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/launcher manifest.xml delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/register.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/register.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/rotate.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/rotate.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/saveopts.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/saveopts.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/sdist.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/sdist.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/setopt.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/setopt.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/test.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/test.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/upload.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/upload.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/upload_docs.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/command/upload_docs.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/compat.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/compat.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/depends.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/depends.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/dist.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/dist.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/extension.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/extension.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/gui-32.exe delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/gui-64.exe delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/gui-arm-32.exe delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/gui.exe delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/package_index.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/package_index.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/py24compat.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/py24compat.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/py27compat.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/py27compat.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/sandbox.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/sandbox.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/script template (dev).py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/script template (dev).pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/script template.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/script template.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/site-patch.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/site-patch.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/ssl_support.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/ssl_support.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/__init__.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/__init__.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/doctest.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/doctest.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/py26compat.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/py26compat.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/server.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/server.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_bdist_egg.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_bdist_egg.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_build_ext.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_build_ext.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_develop.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_develop.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_dist_info.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_dist_info.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_easy_install.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_easy_install.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_egg_info.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_egg_info.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_markerlib.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_markerlib.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_packageindex.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_packageindex.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_resources.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_resources.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sandbox.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sandbox.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sdist.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sdist.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_test.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_test.pyc delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_upload_docs.py delete mode 100644 PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_upload_docs.pyc delete mode 100644 PythonEnv/2.7/Lib/site.py delete mode 100644 PythonEnv/2.7/Lib/site.pyc delete mode 100644 PythonEnv/2.7/Lib/sre.py delete mode 100644 PythonEnv/2.7/Lib/sre_compile.py delete mode 100644 PythonEnv/2.7/Lib/sre_compile.pyc delete mode 100644 PythonEnv/2.7/Lib/sre_constants.py delete mode 100644 PythonEnv/2.7/Lib/sre_constants.pyc delete mode 100644 PythonEnv/2.7/Lib/sre_parse.py delete mode 100644 PythonEnv/2.7/Lib/sre_parse.pyc delete mode 100644 PythonEnv/2.7/Lib/stat.py delete mode 100644 PythonEnv/2.7/Lib/stat.pyc delete mode 100644 PythonEnv/2.7/Lib/types.py delete mode 100644 PythonEnv/2.7/Lib/types.pyc delete mode 100644 PythonEnv/2.7/Lib/warnings.py delete mode 100644 PythonEnv/2.7/Lib/warnings.pyc delete mode 100644 PythonEnv/2.7/Scripts/activate delete mode 100644 PythonEnv/2.7/Scripts/activate.bat delete mode 100644 PythonEnv/2.7/Scripts/activate.ps1 delete mode 100644 PythonEnv/2.7/Scripts/activate_this.py delete mode 100644 PythonEnv/2.7/Scripts/deactivate.bat delete mode 100644 PythonEnv/2.7/Scripts/easy_install-2.7-script.py delete mode 100644 PythonEnv/2.7/Scripts/easy_install-2.7.exe delete mode 100644 PythonEnv/2.7/Scripts/easy_install-script.py delete mode 100644 PythonEnv/2.7/Scripts/easy_install.exe delete mode 100644 PythonEnv/2.7/Scripts/pip-2.7-script.py delete mode 100644 PythonEnv/2.7/Scripts/pip-2.7.exe delete mode 100644 PythonEnv/2.7/Scripts/pip-script.py delete mode 100644 PythonEnv/2.7/Scripts/pip.exe delete mode 100644 PythonEnv/2.7/Scripts/python.exe delete mode 100644 PythonEnv/2.7/Scripts/pythonw.exe delete mode 100644 WinAlfred/App.config create mode 100644 WinAlfred/App.xaml create mode 100644 WinAlfred/App.xaml.cs delete mode 100644 WinAlfred/CustomControls/ResultItemControl.Designer.cs delete mode 100644 WinAlfred/CustomControls/ResultItemControl.cs delete mode 100644 WinAlfred/CustomControls/ResultItemControl.resx delete mode 100644 WinAlfred/FrmMain.Designer.cs delete mode 100644 WinAlfred/FrmMain.cs delete mode 100644 WinAlfred/FrmMain.resx create mode 100644 WinAlfred/MainWindow.xaml create mode 100644 WinAlfred/MainWindow.xaml.cs delete mode 100644 WinAlfred/Program.cs create mode 100644 WinAlfred/ResultItem.xaml create mode 100644 WinAlfred/ResultItem.xaml.cs create mode 100644 WinAlfred/ResultPanel.xaml create mode 100644 WinAlfred/ResultPanel.xaml.cs delete mode 100644 WinAlfred/WinAlfred.idc diff --git a/Plugins/WinAlfred.Plugin.System/Images/lock.png b/Plugins/WinAlfred.Plugin.System/Images/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..5a1593aafe22172c236d3b72df8c532c64849620 GIT binary patch literal 4625 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 Hu0mjf9Dlqa literal 0 HcmV?d00001 diff --git a/Plugins/WinAlfred.Plugin.System/Main.cs b/Plugins/WinAlfred.Plugin.System/Main.cs index da92dfba5..9cd5d7d9e 100644 --- a/Plugins/WinAlfred.Plugin.System/Main.cs +++ b/Plugins/WinAlfred.Plugin.System/Main.cs @@ -1,36 +1,60 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Runtime.InteropServices; using System.Text; +using System.Windows.Forms; namespace WinAlfred.Plugin.System { public class Main : IPlugin { - List results = new List(); + List availableResults = new List(); + + [DllImport("user32")] + public static extern bool ExitWindowsEx(uint uFlags, uint dwReason); + [DllImport("user32")] + public static extern void LockWorkStation(); public List Query(Query query) { - results.Clear(); - + List results = new List(); if (query.ActionParameters.Count == 0) { - results.Add(new Result - { - Title = "Shutdown", - SubTitle = "shutdown your computer", - Score = 100, - Action = () => - { - - } - }); + results = availableResults; + } + else + { + results.AddRange(availableResults.Where(result => result.Title.ToLower().Contains(query.ActionParameters[0].ToLower()))); } return results; } public void Init() { + availableResults.Add(new Result + { + Title = "Shutdown", + SubTitle = "Shutdown Computer", + Score = 100, + Action = () => MessageBox.Show("shutdown") + }); + availableResults.Add(new Result + { + Title = "Log off", + SubTitle = "Log off current user", + Score = 10, + Action = () => MessageBox.Show("Logoff") + }); + availableResults.Add(new Result + { + Title = "Lock", + SubTitle = "Lock this computer", + Score = 20, + IcoPath = "Images\\lock.png", + Action = () => LockWorkStation() + }); } } } diff --git a/Plugins/WinAlfred.Plugin.System/WinAlfred.Plugin.System.csproj b/Plugins/WinAlfred.Plugin.System/WinAlfred.Plugin.System.csproj index dcfc499bf..a8dacb8d1 100644 --- a/Plugins/WinAlfred.Plugin.System/WinAlfred.Plugin.System.csproj +++ b/Plugins/WinAlfred.Plugin.System/WinAlfred.Plugin.System.csproj @@ -32,6 +32,7 @@ + @@ -52,10 +53,14 @@ Always + + + xcopy /Y $(TargetDir)$(TargetFileName) $(SolutionDir)WinAlfred\bin\Debug\Plugins\System\ -xcopy /Y $(TargetDir)plugin.ini $(SolutionDir)WinAlfred\bin\Debug\Plugins\System\ +xcopy /Y $(TargetDir)plugin.ini $(SolutionDir)WinAlfred\bin\Debug\Plugins\System\ +xcopy /Y $(ProjectDir)Images\*.* $(SolutionDir)WinAlfred\bin\Debug\Plugins\System\Images\ I=-=s!MoY3%aY=l0pJIL9|C?D_z~bofgb}t4E(s*1^fi?lfXxSp8|dw_!;15fu93@9{2^|7st-o zUx-WMTl*7nMSO4fi0|x=#Z~d6_(}XMu8Cj7ui`iROM9oi%ie8wiyy>gyWjpyjM}~S z=XRg{sl7*hEe6D(I4vx}#faD|PKo{EfH)`)iNoTEI4X{bZ^W=TE>4J(q9lgIMR7sw z6KBO&;+!}m&POTB$ZqPXY9Wn1lvdRBG167Jr_ nxQUh!+0~aieSDb@O%$o0VgvTqglhaX{#svcpmIv^I`jVtm>$5B diff --git a/PythonEnv/2.7/Lib/encodings/koi8_u.py b/PythonEnv/2.7/Lib/encodings/koi8_u.py deleted file mode 100644 index a9317b12b..000000000 --- a/PythonEnv/2.7/Lib/encodings/koi8_u.py +++ /dev/null @@ -1,307 +0,0 @@ -""" Python Character Mapping Codec koi8_u generated from 'python-mappings/KOI8-U.TXT' with gencodec.py. - -"""#" - -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 - -def getregentry(): - return codecs.CodecInfo( - name='koi8-u', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) - - -### Decoding Table - -decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\u2500' # 0x80 -> BOX DRAWINGS LIGHT HORIZONTAL - u'\u2502' # 0x81 -> BOX DRAWINGS LIGHT VERTICAL - u'\u250c' # 0x82 -> BOX DRAWINGS LIGHT DOWN AND RIGHT - u'\u2510' # 0x83 -> BOX DRAWINGS LIGHT DOWN AND LEFT - u'\u2514' # 0x84 -> BOX DRAWINGS LIGHT UP AND RIGHT - u'\u2518' # 0x85 -> BOX DRAWINGS LIGHT UP AND LEFT - u'\u251c' # 0x86 -> BOX DRAWINGS LIGHT VERTICAL AND RIGHT - u'\u2524' # 0x87 -> BOX DRAWINGS LIGHT VERTICAL AND LEFT - u'\u252c' # 0x88 -> BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - u'\u2534' # 0x89 -> BOX DRAWINGS LIGHT UP AND HORIZONTAL - u'\u253c' # 0x8A -> BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - u'\u2580' # 0x8B -> UPPER HALF BLOCK - u'\u2584' # 0x8C -> LOWER HALF BLOCK - u'\u2588' # 0x8D -> FULL BLOCK - u'\u258c' # 0x8E -> LEFT HALF BLOCK - u'\u2590' # 0x8F -> RIGHT HALF BLOCK - u'\u2591' # 0x90 -> LIGHT SHADE - u'\u2592' # 0x91 -> MEDIUM SHADE - u'\u2593' # 0x92 -> DARK SHADE - u'\u2320' # 0x93 -> TOP HALF INTEGRAL - u'\u25a0' # 0x94 -> BLACK SQUARE - u'\u2219' # 0x95 -> BULLET OPERATOR - u'\u221a' # 0x96 -> SQUARE ROOT - u'\u2248' # 0x97 -> ALMOST EQUAL TO - u'\u2264' # 0x98 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0x99 -> GREATER-THAN OR EQUAL TO - u'\xa0' # 0x9A -> NO-BREAK SPACE - u'\u2321' # 0x9B -> BOTTOM HALF INTEGRAL - u'\xb0' # 0x9C -> DEGREE SIGN - u'\xb2' # 0x9D -> SUPERSCRIPT TWO - u'\xb7' # 0x9E -> MIDDLE DOT - u'\xf7' # 0x9F -> DIVISION SIGN - u'\u2550' # 0xA0 -> BOX DRAWINGS DOUBLE HORIZONTAL - u'\u2551' # 0xA1 -> BOX DRAWINGS DOUBLE VERTICAL - u'\u2552' # 0xA2 -> BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - u'\u0451' # 0xA3 -> CYRILLIC SMALL LETTER IO - u'\u0454' # 0xA4 -> CYRILLIC SMALL LETTER UKRAINIAN IE - u'\u2554' # 0xA5 -> BOX DRAWINGS DOUBLE DOWN AND RIGHT - u'\u0456' # 0xA6 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - u'\u0457' # 0xA7 -> CYRILLIC SMALL LETTER YI (UKRAINIAN) - u'\u2557' # 0xA8 -> BOX DRAWINGS DOUBLE DOWN AND LEFT - u'\u2558' # 0xA9 -> BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - u'\u2559' # 0xAA -> BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - u'\u255a' # 0xAB -> BOX DRAWINGS DOUBLE UP AND RIGHT - u'\u255b' # 0xAC -> BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - u'\u0491' # 0xAD -> CYRILLIC SMALL LETTER UKRAINIAN GHE WITH UPTURN - u'\u255d' # 0xAE -> BOX DRAWINGS DOUBLE UP AND LEFT - u'\u255e' # 0xAF -> BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - u'\u255f' # 0xB0 -> BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - u'\u2560' # 0xB1 -> BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - u'\u2561' # 0xB2 -> BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - u'\u0401' # 0xB3 -> CYRILLIC CAPITAL LETTER IO - u'\u0404' # 0xB4 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE - u'\u2563' # 0xB5 -> BOX DRAWINGS DOUBLE VERTICAL AND LEFT - u'\u0406' # 0xB6 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - u'\u0407' # 0xB7 -> CYRILLIC CAPITAL LETTER YI (UKRAINIAN) - u'\u2566' # 0xB8 -> BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - u'\u2567' # 0xB9 -> BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - u'\u2568' # 0xBA -> BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - u'\u2569' # 0xBB -> BOX DRAWINGS DOUBLE UP AND HORIZONTAL - u'\u256a' # 0xBC -> BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - u'\u0490' # 0xBD -> CYRILLIC CAPITAL LETTER UKRAINIAN GHE WITH UPTURN - u'\u256c' # 0xBE -> BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - u'\xa9' # 0xBF -> COPYRIGHT SIGN - u'\u044e' # 0xC0 -> CYRILLIC SMALL LETTER YU - u'\u0430' # 0xC1 -> CYRILLIC SMALL LETTER A - u'\u0431' # 0xC2 -> CYRILLIC SMALL LETTER BE - u'\u0446' # 0xC3 -> CYRILLIC SMALL LETTER TSE - u'\u0434' # 0xC4 -> CYRILLIC SMALL LETTER DE - u'\u0435' # 0xC5 -> CYRILLIC SMALL LETTER IE - u'\u0444' # 0xC6 -> CYRILLIC SMALL LETTER EF - u'\u0433' # 0xC7 -> CYRILLIC SMALL LETTER GHE - u'\u0445' # 0xC8 -> CYRILLIC SMALL LETTER HA - u'\u0438' # 0xC9 -> CYRILLIC SMALL LETTER I - u'\u0439' # 0xCA -> CYRILLIC SMALL LETTER SHORT I - u'\u043a' # 0xCB -> CYRILLIC SMALL LETTER KA - u'\u043b' # 0xCC -> CYRILLIC SMALL LETTER EL - u'\u043c' # 0xCD -> CYRILLIC SMALL LETTER EM - u'\u043d' # 0xCE -> CYRILLIC SMALL LETTER EN - u'\u043e' # 0xCF -> CYRILLIC SMALL LETTER O - u'\u043f' # 0xD0 -> CYRILLIC SMALL LETTER PE - u'\u044f' # 0xD1 -> CYRILLIC SMALL LETTER YA - u'\u0440' # 0xD2 -> CYRILLIC SMALL LETTER ER - u'\u0441' # 0xD3 -> CYRILLIC SMALL LETTER ES - u'\u0442' # 0xD4 -> CYRILLIC SMALL LETTER TE - u'\u0443' # 0xD5 -> CYRILLIC SMALL LETTER U - u'\u0436' # 0xD6 -> CYRILLIC SMALL LETTER ZHE - u'\u0432' # 0xD7 -> CYRILLIC SMALL LETTER VE - u'\u044c' # 0xD8 -> CYRILLIC SMALL LETTER SOFT SIGN - u'\u044b' # 0xD9 -> CYRILLIC SMALL LETTER YERU - u'\u0437' # 0xDA -> CYRILLIC SMALL LETTER ZE - u'\u0448' # 0xDB -> CYRILLIC SMALL LETTER SHA - u'\u044d' # 0xDC -> CYRILLIC SMALL LETTER E - u'\u0449' # 0xDD -> CYRILLIC SMALL LETTER SHCHA - u'\u0447' # 0xDE -> CYRILLIC SMALL LETTER CHE - u'\u044a' # 0xDF -> CYRILLIC SMALL LETTER HARD SIGN - u'\u042e' # 0xE0 -> CYRILLIC CAPITAL LETTER YU - u'\u0410' # 0xE1 -> CYRILLIC CAPITAL LETTER A - u'\u0411' # 0xE2 -> CYRILLIC CAPITAL LETTER BE - u'\u0426' # 0xE3 -> CYRILLIC CAPITAL LETTER TSE - u'\u0414' # 0xE4 -> CYRILLIC CAPITAL LETTER DE - u'\u0415' # 0xE5 -> CYRILLIC CAPITAL LETTER IE - u'\u0424' # 0xE6 -> CYRILLIC CAPITAL LETTER EF - u'\u0413' # 0xE7 -> CYRILLIC CAPITAL LETTER GHE - u'\u0425' # 0xE8 -> CYRILLIC CAPITAL LETTER HA - u'\u0418' # 0xE9 -> CYRILLIC CAPITAL LETTER I - u'\u0419' # 0xEA -> CYRILLIC CAPITAL LETTER SHORT I - u'\u041a' # 0xEB -> CYRILLIC CAPITAL LETTER KA - u'\u041b' # 0xEC -> CYRILLIC CAPITAL LETTER EL - u'\u041c' # 0xED -> CYRILLIC CAPITAL LETTER EM - u'\u041d' # 0xEE -> CYRILLIC CAPITAL LETTER EN - u'\u041e' # 0xEF -> CYRILLIC CAPITAL LETTER O - u'\u041f' # 0xF0 -> CYRILLIC CAPITAL LETTER PE - u'\u042f' # 0xF1 -> CYRILLIC CAPITAL LETTER YA - u'\u0420' # 0xF2 -> CYRILLIC CAPITAL LETTER ER - u'\u0421' # 0xF3 -> CYRILLIC CAPITAL LETTER ES - u'\u0422' # 0xF4 -> CYRILLIC CAPITAL LETTER TE - u'\u0423' # 0xF5 -> CYRILLIC CAPITAL LETTER U - u'\u0416' # 0xF6 -> CYRILLIC CAPITAL LETTER ZHE - u'\u0412' # 0xF7 -> CYRILLIC CAPITAL LETTER VE - u'\u042c' # 0xF8 -> CYRILLIC CAPITAL LETTER SOFT SIGN - u'\u042b' # 0xF9 -> CYRILLIC CAPITAL LETTER YERU - u'\u0417' # 0xFA -> CYRILLIC CAPITAL LETTER ZE - u'\u0428' # 0xFB -> CYRILLIC CAPITAL LETTER SHA - u'\u042d' # 0xFC -> CYRILLIC CAPITAL LETTER E - u'\u0429' # 0xFD -> CYRILLIC CAPITAL LETTER SHCHA - u'\u0427' # 0xFE -> CYRILLIC CAPITAL LETTER CHE - u'\u042a' # 0xFF -> CYRILLIC CAPITAL LETTER HARD SIGN -) - -### Encoding table -encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/koi8_u.pyc b/PythonEnv/2.7/Lib/encodings/koi8_u.pyc deleted file mode 100644 index 4dde4653ca4c67b4db64118fd1b4e57f5307db34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2851 zcmc&$`(G4Q6ugJxzU$`XYXj0$vS z6?|bnF)A~Q9#)?Z{R3zG6YjszA7JO)ksYOeAo_f2ckkuSIdjiF=X<{Q9DIM2g?kR> zHYM22j}QOW;Lyi$k{N5n*~4TnOLVlVf6-n>Wu&%D9jeX z^rB=f`4YiNL8lQkfoBi;iXr3L%V_OmQbUxWH-hxKp{WTYLC-Y&IBH2eA18ycHV@m4 zKQA-9tlNj-dQe{PZWo^E#w?U3Fm8+@=C~_FVu=XEjCgZOady!Ox{^wY5Y$Y2&Jcbm znwHh{C@Ptl^rg6}UDf1(x?*KhN^NeMw5K;YU?L>WW`R%%Stb~mXD0DTwDq<~5Of4y zh{W>tNF>UEL>Nj%IL**?=M2K{rt47x$Oz#Si)G?zB^EQn;vt=tb18h3NGDOS?vY|O zUC1Qd%8GI5bX3q=>NDoyqArurl(dpD;;HolPc4B`@hNa?0X{n1!s{e6mrq2Czkq!9uN?|R@YjASzozqXTlT!W03y4?GKe@)X7$Dlq zL23oqI}Pk}A*wyytf(PMbg4J!5>gq`snAi?t<1RvNU&RV>xNVMwW(sK#%UsV*l#d* zI1sU01RWxo;!LLw)9IqY)n$@dQL)@(CAwr1F+(CKB+ASTvuY53TNHE(+pM8=F2P5g zNXtCMo}i}`zd`ZMT_%Egygq**SQIJ_mz0*xnmuRky!i_jF1q8+^2K*m+o5|tCm0Z_=+cp09afZSA`C8(w^=?&XcIY^vY9 z$can@7US+dea+k#@>oICuAkr(yF%YN~JT|_O~_N$i36?Zs&XN@BZM!J>2Z# z=00xrb8~>3CO40A^Efxpa&wHESGjqO=eu~mhv$2FzMtm@cz%%Q5ApnA-ao?gBfNKr z_YU*EUfy?>_nn&<;r*v4E>B#U82^2oTLau0Z~-nwDZ9vO>ZNiv zfxVMjj>9IGLqs2kNYt++DvkzqgvozsnsaJOcDfNtZ(-VWONZ#@tDXM6#)l?!>Z90r V{pF!@f4RTHR}m;2Pzj$g!d_PG3h%A@?iL=#Pz zI;2~aIy7O%CF9Uxi)PGwbV_tW^m@`F-4=l>0>2ixq&p(;M9{4T9_b#LmdM&PV+H+M z)+T*rCG$nLR?B?S>ty(_N^rFnbVy&rWYPuNad;g@FgObSTG}^x7TirEn`B!%cY|TB zP2BJIUlob9CJPRh!HcMfw{|mKnBcit92^((AY4T0)3lmw$N6G&yWbDvP2PR9ERy*f z8w^Kk?_RK*rh&q|43sHN@z&_=VDvJ0wX4+b=H`aF$cTWPN{EA~!zrY6Ip zNYB{wQvQ4;t=Q@?-cQ1nzc4p^v|oAg*WdQj` zC!9bI4aOmKjuIvmVviC6K$ZPPkr$;%EEY?X&Lk{Jc64lon@@BY8PVv8R@gEY+@8DwOp6bCe@i;P5T>)9c8jp)+ z6S954K4B#PkH>Hzj6fR1fpq6PYbX?$20DSTh0>8d0V*(S!9hH{P7 zZ17kGwSl5cr2khaXq$J=K>@VNE5kf{Yl^Qr=3Bd0Wo8V_ek0X z+HZ+zQsxgH+<&;WBSkIwC`~VEnqJj%i_e#}9iD+HG^JLUJnPv_c3KjJ|9>S`_ZwFseEC?P9sf(-K7L2&0QK9tbANucu&9!EZ CONTROL CHARACTER - u'\x01' # 0x0001 -> CONTROL CHARACTER - u'\x02' # 0x0002 -> CONTROL CHARACTER - u'\x03' # 0x0003 -> CONTROL CHARACTER - u'\x04' # 0x0004 -> CONTROL CHARACTER - u'\x05' # 0x0005 -> CONTROL CHARACTER - u'\x06' # 0x0006 -> CONTROL CHARACTER - u'\x07' # 0x0007 -> CONTROL CHARACTER - u'\x08' # 0x0008 -> CONTROL CHARACTER - u'\t' # 0x0009 -> CONTROL CHARACTER - u'\n' # 0x000a -> CONTROL CHARACTER - u'\x0b' # 0x000b -> CONTROL CHARACTER - u'\x0c' # 0x000c -> CONTROL CHARACTER - u'\r' # 0x000d -> CONTROL CHARACTER - u'\x0e' # 0x000e -> CONTROL CHARACTER - u'\x0f' # 0x000f -> CONTROL CHARACTER - u'\x10' # 0x0010 -> CONTROL CHARACTER - u'\x11' # 0x0011 -> CONTROL CHARACTER - u'\x12' # 0x0012 -> CONTROL CHARACTER - u'\x13' # 0x0013 -> CONTROL CHARACTER - u'\x14' # 0x0014 -> CONTROL CHARACTER - u'\x15' # 0x0015 -> CONTROL CHARACTER - u'\x16' # 0x0016 -> CONTROL CHARACTER - u'\x17' # 0x0017 -> CONTROL CHARACTER - u'\x18' # 0x0018 -> CONTROL CHARACTER - u'\x19' # 0x0019 -> CONTROL CHARACTER - u'\x1a' # 0x001a -> CONTROL CHARACTER - u'\x1b' # 0x001b -> CONTROL CHARACTER - u'\x1c' # 0x001c -> CONTROL CHARACTER - u'\x1d' # 0x001d -> CONTROL CHARACTER - u'\x1e' # 0x001e -> CONTROL CHARACTER - u'\x1f' # 0x001f -> CONTROL CHARACTER - u' ' # 0x0020 -> SPACE, left-right - u'!' # 0x0021 -> EXCLAMATION MARK, left-right - u'"' # 0x0022 -> QUOTATION MARK, left-right - u'#' # 0x0023 -> NUMBER SIGN, left-right - u'$' # 0x0024 -> DOLLAR SIGN, left-right - u'%' # 0x0025 -> PERCENT SIGN, left-right - u'&' # 0x0026 -> AMPERSAND, left-right - u"'" # 0x0027 -> APOSTROPHE, left-right - u'(' # 0x0028 -> LEFT PARENTHESIS, left-right - u')' # 0x0029 -> RIGHT PARENTHESIS, left-right - u'*' # 0x002a -> ASTERISK, left-right - u'+' # 0x002b -> PLUS SIGN, left-right - u',' # 0x002c -> COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR - u'-' # 0x002d -> HYPHEN-MINUS, left-right - u'.' # 0x002e -> FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR - u'/' # 0x002f -> SOLIDUS, left-right - u'0' # 0x0030 -> DIGIT ZERO; in Arabic-script context, displayed as 0x0660 ARABIC-INDIC DIGIT ZERO - u'1' # 0x0031 -> DIGIT ONE; in Arabic-script context, displayed as 0x0661 ARABIC-INDIC DIGIT ONE - u'2' # 0x0032 -> DIGIT TWO; in Arabic-script context, displayed as 0x0662 ARABIC-INDIC DIGIT TWO - u'3' # 0x0033 -> DIGIT THREE; in Arabic-script context, displayed as 0x0663 ARABIC-INDIC DIGIT THREE - u'4' # 0x0034 -> DIGIT FOUR; in Arabic-script context, displayed as 0x0664 ARABIC-INDIC DIGIT FOUR - u'5' # 0x0035 -> DIGIT FIVE; in Arabic-script context, displayed as 0x0665 ARABIC-INDIC DIGIT FIVE - u'6' # 0x0036 -> DIGIT SIX; in Arabic-script context, displayed as 0x0666 ARABIC-INDIC DIGIT SIX - u'7' # 0x0037 -> DIGIT SEVEN; in Arabic-script context, displayed as 0x0667 ARABIC-INDIC DIGIT SEVEN - u'8' # 0x0038 -> DIGIT EIGHT; in Arabic-script context, displayed as 0x0668 ARABIC-INDIC DIGIT EIGHT - u'9' # 0x0039 -> DIGIT NINE; in Arabic-script context, displayed as 0x0669 ARABIC-INDIC DIGIT NINE - u':' # 0x003a -> COLON, left-right - u';' # 0x003b -> SEMICOLON, left-right - u'<' # 0x003c -> LESS-THAN SIGN, left-right - u'=' # 0x003d -> EQUALS SIGN, left-right - u'>' # 0x003e -> GREATER-THAN SIGN, left-right - u'?' # 0x003f -> QUESTION MARK, left-right - u'@' # 0x0040 -> COMMERCIAL AT - u'A' # 0x0041 -> LATIN CAPITAL LETTER A - u'B' # 0x0042 -> LATIN CAPITAL LETTER B - u'C' # 0x0043 -> LATIN CAPITAL LETTER C - u'D' # 0x0044 -> LATIN CAPITAL LETTER D - u'E' # 0x0045 -> LATIN CAPITAL LETTER E - u'F' # 0x0046 -> LATIN CAPITAL LETTER F - u'G' # 0x0047 -> LATIN CAPITAL LETTER G - u'H' # 0x0048 -> LATIN CAPITAL LETTER H - u'I' # 0x0049 -> LATIN CAPITAL LETTER I - u'J' # 0x004a -> LATIN CAPITAL LETTER J - u'K' # 0x004b -> LATIN CAPITAL LETTER K - u'L' # 0x004c -> LATIN CAPITAL LETTER L - u'M' # 0x004d -> LATIN CAPITAL LETTER M - u'N' # 0x004e -> LATIN CAPITAL LETTER N - u'O' # 0x004f -> LATIN CAPITAL LETTER O - u'P' # 0x0050 -> LATIN CAPITAL LETTER P - u'Q' # 0x0051 -> LATIN CAPITAL LETTER Q - u'R' # 0x0052 -> LATIN CAPITAL LETTER R - u'S' # 0x0053 -> LATIN CAPITAL LETTER S - u'T' # 0x0054 -> LATIN CAPITAL LETTER T - u'U' # 0x0055 -> LATIN CAPITAL LETTER U - u'V' # 0x0056 -> LATIN CAPITAL LETTER V - u'W' # 0x0057 -> LATIN CAPITAL LETTER W - u'X' # 0x0058 -> LATIN CAPITAL LETTER X - u'Y' # 0x0059 -> LATIN CAPITAL LETTER Y - u'Z' # 0x005a -> LATIN CAPITAL LETTER Z - u'[' # 0x005b -> LEFT SQUARE BRACKET, left-right - u'\\' # 0x005c -> REVERSE SOLIDUS, left-right - u']' # 0x005d -> RIGHT SQUARE BRACKET, left-right - u'^' # 0x005e -> CIRCUMFLEX ACCENT, left-right - u'_' # 0x005f -> LOW LINE, left-right - u'`' # 0x0060 -> GRAVE ACCENT - u'a' # 0x0061 -> LATIN SMALL LETTER A - u'b' # 0x0062 -> LATIN SMALL LETTER B - u'c' # 0x0063 -> LATIN SMALL LETTER C - u'd' # 0x0064 -> LATIN SMALL LETTER D - u'e' # 0x0065 -> LATIN SMALL LETTER E - u'f' # 0x0066 -> LATIN SMALL LETTER F - u'g' # 0x0067 -> LATIN SMALL LETTER G - u'h' # 0x0068 -> LATIN SMALL LETTER H - u'i' # 0x0069 -> LATIN SMALL LETTER I - u'j' # 0x006a -> LATIN SMALL LETTER J - u'k' # 0x006b -> LATIN SMALL LETTER K - u'l' # 0x006c -> LATIN SMALL LETTER L - u'm' # 0x006d -> LATIN SMALL LETTER M - u'n' # 0x006e -> LATIN SMALL LETTER N - u'o' # 0x006f -> LATIN SMALL LETTER O - u'p' # 0x0070 -> LATIN SMALL LETTER P - u'q' # 0x0071 -> LATIN SMALL LETTER Q - u'r' # 0x0072 -> LATIN SMALL LETTER R - u's' # 0x0073 -> LATIN SMALL LETTER S - u't' # 0x0074 -> LATIN SMALL LETTER T - u'u' # 0x0075 -> LATIN SMALL LETTER U - u'v' # 0x0076 -> LATIN SMALL LETTER V - u'w' # 0x0077 -> LATIN SMALL LETTER W - u'x' # 0x0078 -> LATIN SMALL LETTER X - u'y' # 0x0079 -> LATIN SMALL LETTER Y - u'z' # 0x007a -> LATIN SMALL LETTER Z - u'{' # 0x007b -> LEFT CURLY BRACKET, left-right - u'|' # 0x007c -> VERTICAL LINE, left-right - u'}' # 0x007d -> RIGHT CURLY BRACKET, left-right - u'~' # 0x007e -> TILDE - u'\x7f' # 0x007f -> CONTROL CHARACTER - u'\xc4' # 0x0080 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xa0' # 0x0081 -> NO-BREAK SPACE, right-left - u'\xc7' # 0x0082 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc9' # 0x0083 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xd1' # 0x0084 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd6' # 0x0085 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x0086 -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xe1' # 0x0087 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe0' # 0x0088 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe2' # 0x0089 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x008a -> LATIN SMALL LETTER A WITH DIAERESIS - u'\u06ba' # 0x008b -> ARABIC LETTER NOON GHUNNA - u'\xab' # 0x008c -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left - u'\xe7' # 0x008d -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe9' # 0x008e -> LATIN SMALL LETTER E WITH ACUTE - u'\xe8' # 0x008f -> LATIN SMALL LETTER E WITH GRAVE - u'\xea' # 0x0090 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x0091 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xed' # 0x0092 -> LATIN SMALL LETTER I WITH ACUTE - u'\u2026' # 0x0093 -> HORIZONTAL ELLIPSIS, right-left - u'\xee' # 0x0094 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x0095 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xf1' # 0x0096 -> LATIN SMALL LETTER N WITH TILDE - u'\xf3' # 0x0097 -> LATIN SMALL LETTER O WITH ACUTE - u'\xbb' # 0x0098 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left - u'\xf4' # 0x0099 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x009a -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf7' # 0x009b -> DIVISION SIGN, right-left - u'\xfa' # 0x009c -> LATIN SMALL LETTER U WITH ACUTE - u'\xf9' # 0x009d -> LATIN SMALL LETTER U WITH GRAVE - u'\xfb' # 0x009e -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0x009f -> LATIN SMALL LETTER U WITH DIAERESIS - u' ' # 0x00a0 -> SPACE, right-left - u'!' # 0x00a1 -> EXCLAMATION MARK, right-left - u'"' # 0x00a2 -> QUOTATION MARK, right-left - u'#' # 0x00a3 -> NUMBER SIGN, right-left - u'$' # 0x00a4 -> DOLLAR SIGN, right-left - u'\u066a' # 0x00a5 -> ARABIC PERCENT SIGN - u'&' # 0x00a6 -> AMPERSAND, right-left - u"'" # 0x00a7 -> APOSTROPHE, right-left - u'(' # 0x00a8 -> LEFT PARENTHESIS, right-left - u')' # 0x00a9 -> RIGHT PARENTHESIS, right-left - u'*' # 0x00aa -> ASTERISK, right-left - u'+' # 0x00ab -> PLUS SIGN, right-left - u'\u060c' # 0x00ac -> ARABIC COMMA - u'-' # 0x00ad -> HYPHEN-MINUS, right-left - u'.' # 0x00ae -> FULL STOP, right-left - u'/' # 0x00af -> SOLIDUS, right-left - u'\u0660' # 0x00b0 -> ARABIC-INDIC DIGIT ZERO, right-left (need override) - u'\u0661' # 0x00b1 -> ARABIC-INDIC DIGIT ONE, right-left (need override) - u'\u0662' # 0x00b2 -> ARABIC-INDIC DIGIT TWO, right-left (need override) - u'\u0663' # 0x00b3 -> ARABIC-INDIC DIGIT THREE, right-left (need override) - u'\u0664' # 0x00b4 -> ARABIC-INDIC DIGIT FOUR, right-left (need override) - u'\u0665' # 0x00b5 -> ARABIC-INDIC DIGIT FIVE, right-left (need override) - u'\u0666' # 0x00b6 -> ARABIC-INDIC DIGIT SIX, right-left (need override) - u'\u0667' # 0x00b7 -> ARABIC-INDIC DIGIT SEVEN, right-left (need override) - u'\u0668' # 0x00b8 -> ARABIC-INDIC DIGIT EIGHT, right-left (need override) - u'\u0669' # 0x00b9 -> ARABIC-INDIC DIGIT NINE, right-left (need override) - u':' # 0x00ba -> COLON, right-left - u'\u061b' # 0x00bb -> ARABIC SEMICOLON - u'<' # 0x00bc -> LESS-THAN SIGN, right-left - u'=' # 0x00bd -> EQUALS SIGN, right-left - u'>' # 0x00be -> GREATER-THAN SIGN, right-left - u'\u061f' # 0x00bf -> ARABIC QUESTION MARK - u'\u274a' # 0x00c0 -> EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left - u'\u0621' # 0x00c1 -> ARABIC LETTER HAMZA - u'\u0622' # 0x00c2 -> ARABIC LETTER ALEF WITH MADDA ABOVE - u'\u0623' # 0x00c3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE - u'\u0624' # 0x00c4 -> ARABIC LETTER WAW WITH HAMZA ABOVE - u'\u0625' # 0x00c5 -> ARABIC LETTER ALEF WITH HAMZA BELOW - u'\u0626' # 0x00c6 -> ARABIC LETTER YEH WITH HAMZA ABOVE - u'\u0627' # 0x00c7 -> ARABIC LETTER ALEF - u'\u0628' # 0x00c8 -> ARABIC LETTER BEH - u'\u0629' # 0x00c9 -> ARABIC LETTER TEH MARBUTA - u'\u062a' # 0x00ca -> ARABIC LETTER TEH - u'\u062b' # 0x00cb -> ARABIC LETTER THEH - u'\u062c' # 0x00cc -> ARABIC LETTER JEEM - u'\u062d' # 0x00cd -> ARABIC LETTER HAH - u'\u062e' # 0x00ce -> ARABIC LETTER KHAH - u'\u062f' # 0x00cf -> ARABIC LETTER DAL - u'\u0630' # 0x00d0 -> ARABIC LETTER THAL - u'\u0631' # 0x00d1 -> ARABIC LETTER REH - u'\u0632' # 0x00d2 -> ARABIC LETTER ZAIN - u'\u0633' # 0x00d3 -> ARABIC LETTER SEEN - u'\u0634' # 0x00d4 -> ARABIC LETTER SHEEN - u'\u0635' # 0x00d5 -> ARABIC LETTER SAD - u'\u0636' # 0x00d6 -> ARABIC LETTER DAD - u'\u0637' # 0x00d7 -> ARABIC LETTER TAH - u'\u0638' # 0x00d8 -> ARABIC LETTER ZAH - u'\u0639' # 0x00d9 -> ARABIC LETTER AIN - u'\u063a' # 0x00da -> ARABIC LETTER GHAIN - u'[' # 0x00db -> LEFT SQUARE BRACKET, right-left - u'\\' # 0x00dc -> REVERSE SOLIDUS, right-left - u']' # 0x00dd -> RIGHT SQUARE BRACKET, right-left - u'^' # 0x00de -> CIRCUMFLEX ACCENT, right-left - u'_' # 0x00df -> LOW LINE, right-left - u'\u0640' # 0x00e0 -> ARABIC TATWEEL - u'\u0641' # 0x00e1 -> ARABIC LETTER FEH - u'\u0642' # 0x00e2 -> ARABIC LETTER QAF - u'\u0643' # 0x00e3 -> ARABIC LETTER KAF - u'\u0644' # 0x00e4 -> ARABIC LETTER LAM - u'\u0645' # 0x00e5 -> ARABIC LETTER MEEM - u'\u0646' # 0x00e6 -> ARABIC LETTER NOON - u'\u0647' # 0x00e7 -> ARABIC LETTER HEH - u'\u0648' # 0x00e8 -> ARABIC LETTER WAW - u'\u0649' # 0x00e9 -> ARABIC LETTER ALEF MAKSURA - u'\u064a' # 0x00ea -> ARABIC LETTER YEH - u'\u064b' # 0x00eb -> ARABIC FATHATAN - u'\u064c' # 0x00ec -> ARABIC DAMMATAN - u'\u064d' # 0x00ed -> ARABIC KASRATAN - u'\u064e' # 0x00ee -> ARABIC FATHA - u'\u064f' # 0x00ef -> ARABIC DAMMA - u'\u0650' # 0x00f0 -> ARABIC KASRA - u'\u0651' # 0x00f1 -> ARABIC SHADDA - u'\u0652' # 0x00f2 -> ARABIC SUKUN - u'\u067e' # 0x00f3 -> ARABIC LETTER PEH - u'\u0679' # 0x00f4 -> ARABIC LETTER TTEH - u'\u0686' # 0x00f5 -> ARABIC LETTER TCHEH - u'\u06d5' # 0x00f6 -> ARABIC LETTER AE - u'\u06a4' # 0x00f7 -> ARABIC LETTER VEH - u'\u06af' # 0x00f8 -> ARABIC LETTER GAF - u'\u0688' # 0x00f9 -> ARABIC LETTER DDAL - u'\u0691' # 0x00fa -> ARABIC LETTER RREH - u'{' # 0x00fb -> LEFT CURLY BRACKET, right-left - u'|' # 0x00fc -> VERTICAL LINE, right-left - u'}' # 0x00fd -> RIGHT CURLY BRACKET, right-left - u'\u0698' # 0x00fe -> ARABIC LETTER JEH - u'\u06d2' # 0x00ff -> ARABIC LETTER YEH BARREE -) - -### Encoding Map - -encoding_map = { - 0x0000: 0x0000, # CONTROL CHARACTER - 0x0001: 0x0001, # CONTROL CHARACTER - 0x0002: 0x0002, # CONTROL CHARACTER - 0x0003: 0x0003, # CONTROL CHARACTER - 0x0004: 0x0004, # CONTROL CHARACTER - 0x0005: 0x0005, # CONTROL CHARACTER - 0x0006: 0x0006, # CONTROL CHARACTER - 0x0007: 0x0007, # CONTROL CHARACTER - 0x0008: 0x0008, # CONTROL CHARACTER - 0x0009: 0x0009, # CONTROL CHARACTER - 0x000a: 0x000a, # CONTROL CHARACTER - 0x000b: 0x000b, # CONTROL CHARACTER - 0x000c: 0x000c, # CONTROL CHARACTER - 0x000d: 0x000d, # CONTROL CHARACTER - 0x000e: 0x000e, # CONTROL CHARACTER - 0x000f: 0x000f, # CONTROL CHARACTER - 0x0010: 0x0010, # CONTROL CHARACTER - 0x0011: 0x0011, # CONTROL CHARACTER - 0x0012: 0x0012, # CONTROL CHARACTER - 0x0013: 0x0013, # CONTROL CHARACTER - 0x0014: 0x0014, # CONTROL CHARACTER - 0x0015: 0x0015, # CONTROL CHARACTER - 0x0016: 0x0016, # CONTROL CHARACTER - 0x0017: 0x0017, # CONTROL CHARACTER - 0x0018: 0x0018, # CONTROL CHARACTER - 0x0019: 0x0019, # CONTROL CHARACTER - 0x001a: 0x001a, # CONTROL CHARACTER - 0x001b: 0x001b, # CONTROL CHARACTER - 0x001c: 0x001c, # CONTROL CHARACTER - 0x001d: 0x001d, # CONTROL CHARACTER - 0x001e: 0x001e, # CONTROL CHARACTER - 0x001f: 0x001f, # CONTROL CHARACTER - 0x0020: 0x0020, # SPACE, left-right - 0x0020: 0x00a0, # SPACE, right-left - 0x0021: 0x0021, # EXCLAMATION MARK, left-right - 0x0021: 0x00a1, # EXCLAMATION MARK, right-left - 0x0022: 0x0022, # QUOTATION MARK, left-right - 0x0022: 0x00a2, # QUOTATION MARK, right-left - 0x0023: 0x0023, # NUMBER SIGN, left-right - 0x0023: 0x00a3, # NUMBER SIGN, right-left - 0x0024: 0x0024, # DOLLAR SIGN, left-right - 0x0024: 0x00a4, # DOLLAR SIGN, right-left - 0x0025: 0x0025, # PERCENT SIGN, left-right - 0x0026: 0x0026, # AMPERSAND, left-right - 0x0026: 0x00a6, # AMPERSAND, right-left - 0x0027: 0x0027, # APOSTROPHE, left-right - 0x0027: 0x00a7, # APOSTROPHE, right-left - 0x0028: 0x0028, # LEFT PARENTHESIS, left-right - 0x0028: 0x00a8, # LEFT PARENTHESIS, right-left - 0x0029: 0x0029, # RIGHT PARENTHESIS, left-right - 0x0029: 0x00a9, # RIGHT PARENTHESIS, right-left - 0x002a: 0x002a, # ASTERISK, left-right - 0x002a: 0x00aa, # ASTERISK, right-left - 0x002b: 0x002b, # PLUS SIGN, left-right - 0x002b: 0x00ab, # PLUS SIGN, right-left - 0x002c: 0x002c, # COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR - 0x002d: 0x002d, # HYPHEN-MINUS, left-right - 0x002d: 0x00ad, # HYPHEN-MINUS, right-left - 0x002e: 0x002e, # FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR - 0x002e: 0x00ae, # FULL STOP, right-left - 0x002f: 0x002f, # SOLIDUS, left-right - 0x002f: 0x00af, # SOLIDUS, right-left - 0x0030: 0x0030, # DIGIT ZERO; in Arabic-script context, displayed as 0x0660 ARABIC-INDIC DIGIT ZERO - 0x0031: 0x0031, # DIGIT ONE; in Arabic-script context, displayed as 0x0661 ARABIC-INDIC DIGIT ONE - 0x0032: 0x0032, # DIGIT TWO; in Arabic-script context, displayed as 0x0662 ARABIC-INDIC DIGIT TWO - 0x0033: 0x0033, # DIGIT THREE; in Arabic-script context, displayed as 0x0663 ARABIC-INDIC DIGIT THREE - 0x0034: 0x0034, # DIGIT FOUR; in Arabic-script context, displayed as 0x0664 ARABIC-INDIC DIGIT FOUR - 0x0035: 0x0035, # DIGIT FIVE; in Arabic-script context, displayed as 0x0665 ARABIC-INDIC DIGIT FIVE - 0x0036: 0x0036, # DIGIT SIX; in Arabic-script context, displayed as 0x0666 ARABIC-INDIC DIGIT SIX - 0x0037: 0x0037, # DIGIT SEVEN; in Arabic-script context, displayed as 0x0667 ARABIC-INDIC DIGIT SEVEN - 0x0038: 0x0038, # DIGIT EIGHT; in Arabic-script context, displayed as 0x0668 ARABIC-INDIC DIGIT EIGHT - 0x0039: 0x0039, # DIGIT NINE; in Arabic-script context, displayed as 0x0669 ARABIC-INDIC DIGIT NINE - 0x003a: 0x003a, # COLON, left-right - 0x003a: 0x00ba, # COLON, right-left - 0x003b: 0x003b, # SEMICOLON, left-right - 0x003c: 0x003c, # LESS-THAN SIGN, left-right - 0x003c: 0x00bc, # LESS-THAN SIGN, right-left - 0x003d: 0x003d, # EQUALS SIGN, left-right - 0x003d: 0x00bd, # EQUALS SIGN, right-left - 0x003e: 0x003e, # GREATER-THAN SIGN, left-right - 0x003e: 0x00be, # GREATER-THAN SIGN, right-left - 0x003f: 0x003f, # QUESTION MARK, left-right - 0x0040: 0x0040, # COMMERCIAL AT - 0x0041: 0x0041, # LATIN CAPITAL LETTER A - 0x0042: 0x0042, # LATIN CAPITAL LETTER B - 0x0043: 0x0043, # LATIN CAPITAL LETTER C - 0x0044: 0x0044, # LATIN CAPITAL LETTER D - 0x0045: 0x0045, # LATIN CAPITAL LETTER E - 0x0046: 0x0046, # LATIN CAPITAL LETTER F - 0x0047: 0x0047, # LATIN CAPITAL LETTER G - 0x0048: 0x0048, # LATIN CAPITAL LETTER H - 0x0049: 0x0049, # LATIN CAPITAL LETTER I - 0x004a: 0x004a, # LATIN CAPITAL LETTER J - 0x004b: 0x004b, # LATIN CAPITAL LETTER K - 0x004c: 0x004c, # LATIN CAPITAL LETTER L - 0x004d: 0x004d, # LATIN CAPITAL LETTER M - 0x004e: 0x004e, # LATIN CAPITAL LETTER N - 0x004f: 0x004f, # LATIN CAPITAL LETTER O - 0x0050: 0x0050, # LATIN CAPITAL LETTER P - 0x0051: 0x0051, # LATIN CAPITAL LETTER Q - 0x0052: 0x0052, # LATIN CAPITAL LETTER R - 0x0053: 0x0053, # LATIN CAPITAL LETTER S - 0x0054: 0x0054, # LATIN CAPITAL LETTER T - 0x0055: 0x0055, # LATIN CAPITAL LETTER U - 0x0056: 0x0056, # LATIN CAPITAL LETTER V - 0x0057: 0x0057, # LATIN CAPITAL LETTER W - 0x0058: 0x0058, # LATIN CAPITAL LETTER X - 0x0059: 0x0059, # LATIN CAPITAL LETTER Y - 0x005a: 0x005a, # LATIN CAPITAL LETTER Z - 0x005b: 0x005b, # LEFT SQUARE BRACKET, left-right - 0x005b: 0x00db, # LEFT SQUARE BRACKET, right-left - 0x005c: 0x005c, # REVERSE SOLIDUS, left-right - 0x005c: 0x00dc, # REVERSE SOLIDUS, right-left - 0x005d: 0x005d, # RIGHT SQUARE BRACKET, left-right - 0x005d: 0x00dd, # RIGHT SQUARE BRACKET, right-left - 0x005e: 0x005e, # CIRCUMFLEX ACCENT, left-right - 0x005e: 0x00de, # CIRCUMFLEX ACCENT, right-left - 0x005f: 0x005f, # LOW LINE, left-right - 0x005f: 0x00df, # LOW LINE, right-left - 0x0060: 0x0060, # GRAVE ACCENT - 0x0061: 0x0061, # LATIN SMALL LETTER A - 0x0062: 0x0062, # LATIN SMALL LETTER B - 0x0063: 0x0063, # LATIN SMALL LETTER C - 0x0064: 0x0064, # LATIN SMALL LETTER D - 0x0065: 0x0065, # LATIN SMALL LETTER E - 0x0066: 0x0066, # LATIN SMALL LETTER F - 0x0067: 0x0067, # LATIN SMALL LETTER G - 0x0068: 0x0068, # LATIN SMALL LETTER H - 0x0069: 0x0069, # LATIN SMALL LETTER I - 0x006a: 0x006a, # LATIN SMALL LETTER J - 0x006b: 0x006b, # LATIN SMALL LETTER K - 0x006c: 0x006c, # LATIN SMALL LETTER L - 0x006d: 0x006d, # LATIN SMALL LETTER M - 0x006e: 0x006e, # LATIN SMALL LETTER N - 0x006f: 0x006f, # LATIN SMALL LETTER O - 0x0070: 0x0070, # LATIN SMALL LETTER P - 0x0071: 0x0071, # LATIN SMALL LETTER Q - 0x0072: 0x0072, # LATIN SMALL LETTER R - 0x0073: 0x0073, # LATIN SMALL LETTER S - 0x0074: 0x0074, # LATIN SMALL LETTER T - 0x0075: 0x0075, # LATIN SMALL LETTER U - 0x0076: 0x0076, # LATIN SMALL LETTER V - 0x0077: 0x0077, # LATIN SMALL LETTER W - 0x0078: 0x0078, # LATIN SMALL LETTER X - 0x0079: 0x0079, # LATIN SMALL LETTER Y - 0x007a: 0x007a, # LATIN SMALL LETTER Z - 0x007b: 0x007b, # LEFT CURLY BRACKET, left-right - 0x007b: 0x00fb, # LEFT CURLY BRACKET, right-left - 0x007c: 0x007c, # VERTICAL LINE, left-right - 0x007c: 0x00fc, # VERTICAL LINE, right-left - 0x007d: 0x007d, # RIGHT CURLY BRACKET, left-right - 0x007d: 0x00fd, # RIGHT CURLY BRACKET, right-left - 0x007e: 0x007e, # TILDE - 0x007f: 0x007f, # CONTROL CHARACTER - 0x00a0: 0x0081, # NO-BREAK SPACE, right-left - 0x00ab: 0x008c, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left - 0x00bb: 0x0098, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left - 0x00c4: 0x0080, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x00c7: 0x0082, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x00c9: 0x0083, # LATIN CAPITAL LETTER E WITH ACUTE - 0x00d1: 0x0084, # LATIN CAPITAL LETTER N WITH TILDE - 0x00d6: 0x0085, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x00dc: 0x0086, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x00e0: 0x0088, # LATIN SMALL LETTER A WITH GRAVE - 0x00e1: 0x0087, # LATIN SMALL LETTER A WITH ACUTE - 0x00e2: 0x0089, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x00e4: 0x008a, # LATIN SMALL LETTER A WITH DIAERESIS - 0x00e7: 0x008d, # LATIN SMALL LETTER C WITH CEDILLA - 0x00e8: 0x008f, # LATIN SMALL LETTER E WITH GRAVE - 0x00e9: 0x008e, # LATIN SMALL LETTER E WITH ACUTE - 0x00ea: 0x0090, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x00eb: 0x0091, # LATIN SMALL LETTER E WITH DIAERESIS - 0x00ed: 0x0092, # LATIN SMALL LETTER I WITH ACUTE - 0x00ee: 0x0094, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x00ef: 0x0095, # LATIN SMALL LETTER I WITH DIAERESIS - 0x00f1: 0x0096, # LATIN SMALL LETTER N WITH TILDE - 0x00f3: 0x0097, # LATIN SMALL LETTER O WITH ACUTE - 0x00f4: 0x0099, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x00f6: 0x009a, # LATIN SMALL LETTER O WITH DIAERESIS - 0x00f7: 0x009b, # DIVISION SIGN, right-left - 0x00f9: 0x009d, # LATIN SMALL LETTER U WITH GRAVE - 0x00fa: 0x009c, # LATIN SMALL LETTER U WITH ACUTE - 0x00fb: 0x009e, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x00fc: 0x009f, # LATIN SMALL LETTER U WITH DIAERESIS - 0x060c: 0x00ac, # ARABIC COMMA - 0x061b: 0x00bb, # ARABIC SEMICOLON - 0x061f: 0x00bf, # ARABIC QUESTION MARK - 0x0621: 0x00c1, # ARABIC LETTER HAMZA - 0x0622: 0x00c2, # ARABIC LETTER ALEF WITH MADDA ABOVE - 0x0623: 0x00c3, # ARABIC LETTER ALEF WITH HAMZA ABOVE - 0x0624: 0x00c4, # ARABIC LETTER WAW WITH HAMZA ABOVE - 0x0625: 0x00c5, # ARABIC LETTER ALEF WITH HAMZA BELOW - 0x0626: 0x00c6, # ARABIC LETTER YEH WITH HAMZA ABOVE - 0x0627: 0x00c7, # ARABIC LETTER ALEF - 0x0628: 0x00c8, # ARABIC LETTER BEH - 0x0629: 0x00c9, # ARABIC LETTER TEH MARBUTA - 0x062a: 0x00ca, # ARABIC LETTER TEH - 0x062b: 0x00cb, # ARABIC LETTER THEH - 0x062c: 0x00cc, # ARABIC LETTER JEEM - 0x062d: 0x00cd, # ARABIC LETTER HAH - 0x062e: 0x00ce, # ARABIC LETTER KHAH - 0x062f: 0x00cf, # ARABIC LETTER DAL - 0x0630: 0x00d0, # ARABIC LETTER THAL - 0x0631: 0x00d1, # ARABIC LETTER REH - 0x0632: 0x00d2, # ARABIC LETTER ZAIN - 0x0633: 0x00d3, # ARABIC LETTER SEEN - 0x0634: 0x00d4, # ARABIC LETTER SHEEN - 0x0635: 0x00d5, # ARABIC LETTER SAD - 0x0636: 0x00d6, # ARABIC LETTER DAD - 0x0637: 0x00d7, # ARABIC LETTER TAH - 0x0638: 0x00d8, # ARABIC LETTER ZAH - 0x0639: 0x00d9, # ARABIC LETTER AIN - 0x063a: 0x00da, # ARABIC LETTER GHAIN - 0x0640: 0x00e0, # ARABIC TATWEEL - 0x0641: 0x00e1, # ARABIC LETTER FEH - 0x0642: 0x00e2, # ARABIC LETTER QAF - 0x0643: 0x00e3, # ARABIC LETTER KAF - 0x0644: 0x00e4, # ARABIC LETTER LAM - 0x0645: 0x00e5, # ARABIC LETTER MEEM - 0x0646: 0x00e6, # ARABIC LETTER NOON - 0x0647: 0x00e7, # ARABIC LETTER HEH - 0x0648: 0x00e8, # ARABIC LETTER WAW - 0x0649: 0x00e9, # ARABIC LETTER ALEF MAKSURA - 0x064a: 0x00ea, # ARABIC LETTER YEH - 0x064b: 0x00eb, # ARABIC FATHATAN - 0x064c: 0x00ec, # ARABIC DAMMATAN - 0x064d: 0x00ed, # ARABIC KASRATAN - 0x064e: 0x00ee, # ARABIC FATHA - 0x064f: 0x00ef, # ARABIC DAMMA - 0x0650: 0x00f0, # ARABIC KASRA - 0x0651: 0x00f1, # ARABIC SHADDA - 0x0652: 0x00f2, # ARABIC SUKUN - 0x0660: 0x00b0, # ARABIC-INDIC DIGIT ZERO, right-left (need override) - 0x0661: 0x00b1, # ARABIC-INDIC DIGIT ONE, right-left (need override) - 0x0662: 0x00b2, # ARABIC-INDIC DIGIT TWO, right-left (need override) - 0x0663: 0x00b3, # ARABIC-INDIC DIGIT THREE, right-left (need override) - 0x0664: 0x00b4, # ARABIC-INDIC DIGIT FOUR, right-left (need override) - 0x0665: 0x00b5, # ARABIC-INDIC DIGIT FIVE, right-left (need override) - 0x0666: 0x00b6, # ARABIC-INDIC DIGIT SIX, right-left (need override) - 0x0667: 0x00b7, # ARABIC-INDIC DIGIT SEVEN, right-left (need override) - 0x0668: 0x00b8, # ARABIC-INDIC DIGIT EIGHT, right-left (need override) - 0x0669: 0x00b9, # ARABIC-INDIC DIGIT NINE, right-left (need override) - 0x066a: 0x00a5, # ARABIC PERCENT SIGN - 0x0679: 0x00f4, # ARABIC LETTER TTEH - 0x067e: 0x00f3, # ARABIC LETTER PEH - 0x0686: 0x00f5, # ARABIC LETTER TCHEH - 0x0688: 0x00f9, # ARABIC LETTER DDAL - 0x0691: 0x00fa, # ARABIC LETTER RREH - 0x0698: 0x00fe, # ARABIC LETTER JEH - 0x06a4: 0x00f7, # ARABIC LETTER VEH - 0x06af: 0x00f8, # ARABIC LETTER GAF - 0x06ba: 0x008b, # ARABIC LETTER NOON GHUNNA - 0x06d2: 0x00ff, # ARABIC LETTER YEH BARREE - 0x06d5: 0x00f6, # ARABIC LETTER AE - 0x2026: 0x0093, # HORIZONTAL ELLIPSIS, right-left - 0x274a: 0x00c0, # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left -} diff --git a/PythonEnv/2.7/Lib/encodings/mac_arabic.pyc b/PythonEnv/2.7/Lib/encodings/mac_arabic.pyc deleted file mode 100644 index 5b08caec8d70248351aabe3b53538b77d9b25577..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7989 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 TPR CONTROL CHARACTER - u'\x01' # 0x01 -> CONTROL CHARACTER - u'\x02' # 0x02 -> CONTROL CHARACTER - u'\x03' # 0x03 -> CONTROL CHARACTER - u'\x04' # 0x04 -> CONTROL CHARACTER - u'\x05' # 0x05 -> CONTROL CHARACTER - u'\x06' # 0x06 -> CONTROL CHARACTER - u'\x07' # 0x07 -> CONTROL CHARACTER - u'\x08' # 0x08 -> CONTROL CHARACTER - u'\t' # 0x09 -> CONTROL CHARACTER - u'\n' # 0x0A -> CONTROL CHARACTER - u'\x0b' # 0x0B -> CONTROL CHARACTER - u'\x0c' # 0x0C -> CONTROL CHARACTER - u'\r' # 0x0D -> CONTROL CHARACTER - u'\x0e' # 0x0E -> CONTROL CHARACTER - u'\x0f' # 0x0F -> CONTROL CHARACTER - u'\x10' # 0x10 -> CONTROL CHARACTER - u'\x11' # 0x11 -> CONTROL CHARACTER - u'\x12' # 0x12 -> CONTROL CHARACTER - u'\x13' # 0x13 -> CONTROL CHARACTER - u'\x14' # 0x14 -> CONTROL CHARACTER - u'\x15' # 0x15 -> CONTROL CHARACTER - u'\x16' # 0x16 -> CONTROL CHARACTER - u'\x17' # 0x17 -> CONTROL CHARACTER - u'\x18' # 0x18 -> CONTROL CHARACTER - u'\x19' # 0x19 -> CONTROL CHARACTER - u'\x1a' # 0x1A -> CONTROL CHARACTER - u'\x1b' # 0x1B -> CONTROL CHARACTER - u'\x1c' # 0x1C -> CONTROL CHARACTER - u'\x1d' # 0x1D -> CONTROL CHARACTER - u'\x1e' # 0x1E -> CONTROL CHARACTER - u'\x1f' # 0x1F -> CONTROL CHARACTER - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> CONTROL CHARACTER - u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\u0100' # 0x81 -> LATIN CAPITAL LETTER A WITH MACRON - u'\u0101' # 0x82 -> LATIN SMALL LETTER A WITH MACRON - u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\u0104' # 0x84 -> LATIN CAPITAL LETTER A WITH OGONEK - u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE - u'\u0105' # 0x88 -> LATIN SMALL LETTER A WITH OGONEK - u'\u010c' # 0x89 -> LATIN CAPITAL LETTER C WITH CARON - u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - u'\u010d' # 0x8B -> LATIN SMALL LETTER C WITH CARON - u'\u0106' # 0x8C -> LATIN CAPITAL LETTER C WITH ACUTE - u'\u0107' # 0x8D -> LATIN SMALL LETTER C WITH ACUTE - u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - u'\u0179' # 0x8F -> LATIN CAPITAL LETTER Z WITH ACUTE - u'\u017a' # 0x90 -> LATIN SMALL LETTER Z WITH ACUTE - u'\u010e' # 0x91 -> LATIN CAPITAL LETTER D WITH CARON - u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE - u'\u010f' # 0x93 -> LATIN SMALL LETTER D WITH CARON - u'\u0112' # 0x94 -> LATIN CAPITAL LETTER E WITH MACRON - u'\u0113' # 0x95 -> LATIN SMALL LETTER E WITH MACRON - u'\u0116' # 0x96 -> LATIN CAPITAL LETTER E WITH DOT ABOVE - u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE - u'\u0117' # 0x98 -> LATIN SMALL LETTER E WITH DOT ABOVE - u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE - u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE - u'\u011a' # 0x9D -> LATIN CAPITAL LETTER E WITH CARON - u'\u011b' # 0x9E -> LATIN SMALL LETTER E WITH CARON - u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u2020' # 0xA0 -> DAGGER - u'\xb0' # 0xA1 -> DEGREE SIGN - u'\u0118' # 0xA2 -> LATIN CAPITAL LETTER E WITH OGONEK - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa7' # 0xA4 -> SECTION SIGN - u'\u2022' # 0xA5 -> BULLET - u'\xb6' # 0xA6 -> PILCROW SIGN - u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S - u'\xae' # 0xA8 -> REGISTERED SIGN - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u2122' # 0xAA -> TRADE MARK SIGN - u'\u0119' # 0xAB -> LATIN SMALL LETTER E WITH OGONEK - u'\xa8' # 0xAC -> DIAERESIS - u'\u2260' # 0xAD -> NOT EQUAL TO - u'\u0123' # 0xAE -> LATIN SMALL LETTER G WITH CEDILLA - u'\u012e' # 0xAF -> LATIN CAPITAL LETTER I WITH OGONEK - u'\u012f' # 0xB0 -> LATIN SMALL LETTER I WITH OGONEK - u'\u012a' # 0xB1 -> LATIN CAPITAL LETTER I WITH MACRON - u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - u'\u012b' # 0xB4 -> LATIN SMALL LETTER I WITH MACRON - u'\u0136' # 0xB5 -> LATIN CAPITAL LETTER K WITH CEDILLA - u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL - u'\u2211' # 0xB7 -> N-ARY SUMMATION - u'\u0142' # 0xB8 -> LATIN SMALL LETTER L WITH STROKE - u'\u013b' # 0xB9 -> LATIN CAPITAL LETTER L WITH CEDILLA - u'\u013c' # 0xBA -> LATIN SMALL LETTER L WITH CEDILLA - u'\u013d' # 0xBB -> LATIN CAPITAL LETTER L WITH CARON - u'\u013e' # 0xBC -> LATIN SMALL LETTER L WITH CARON - u'\u0139' # 0xBD -> LATIN CAPITAL LETTER L WITH ACUTE - u'\u013a' # 0xBE -> LATIN SMALL LETTER L WITH ACUTE - u'\u0145' # 0xBF -> LATIN CAPITAL LETTER N WITH CEDILLA - u'\u0146' # 0xC0 -> LATIN SMALL LETTER N WITH CEDILLA - u'\u0143' # 0xC1 -> LATIN CAPITAL LETTER N WITH ACUTE - u'\xac' # 0xC2 -> NOT SIGN - u'\u221a' # 0xC3 -> SQUARE ROOT - u'\u0144' # 0xC4 -> LATIN SMALL LETTER N WITH ACUTE - u'\u0147' # 0xC5 -> LATIN CAPITAL LETTER N WITH CARON - u'\u2206' # 0xC6 -> INCREMENT - u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - u'\xa0' # 0xCA -> NO-BREAK SPACE - u'\u0148' # 0xCB -> LATIN SMALL LETTER N WITH CARON - u'\u0150' # 0xCC -> LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE - u'\u0151' # 0xCE -> LATIN SMALL LETTER O WITH DOUBLE ACUTE - u'\u014c' # 0xCF -> LATIN CAPITAL LETTER O WITH MACRON - u'\u2013' # 0xD0 -> EN DASH - u'\u2014' # 0xD1 -> EM DASH - u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - u'\xf7' # 0xD6 -> DIVISION SIGN - u'\u25ca' # 0xD7 -> LOZENGE - u'\u014d' # 0xD8 -> LATIN SMALL LETTER O WITH MACRON - u'\u0154' # 0xD9 -> LATIN CAPITAL LETTER R WITH ACUTE - u'\u0155' # 0xDA -> LATIN SMALL LETTER R WITH ACUTE - u'\u0158' # 0xDB -> LATIN CAPITAL LETTER R WITH CARON - u'\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - u'\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - u'\u0159' # 0xDE -> LATIN SMALL LETTER R WITH CARON - u'\u0156' # 0xDF -> LATIN CAPITAL LETTER R WITH CEDILLA - u'\u0157' # 0xE0 -> LATIN SMALL LETTER R WITH CEDILLA - u'\u0160' # 0xE1 -> LATIN CAPITAL LETTER S WITH CARON - u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK - u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK - u'\u0161' # 0xE4 -> LATIN SMALL LETTER S WITH CARON - u'\u015a' # 0xE5 -> LATIN CAPITAL LETTER S WITH ACUTE - u'\u015b' # 0xE6 -> LATIN SMALL LETTER S WITH ACUTE - u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\u0164' # 0xE8 -> LATIN CAPITAL LETTER T WITH CARON - u'\u0165' # 0xE9 -> LATIN SMALL LETTER T WITH CARON - u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE - u'\u017d' # 0xEB -> LATIN CAPITAL LETTER Z WITH CARON - u'\u017e' # 0xEC -> LATIN SMALL LETTER Z WITH CARON - u'\u016a' # 0xED -> LATIN CAPITAL LETTER U WITH MACRON - u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\u016b' # 0xF0 -> LATIN SMALL LETTER U WITH MACRON - u'\u016e' # 0xF1 -> LATIN CAPITAL LETTER U WITH RING ABOVE - u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE - u'\u016f' # 0xF3 -> LATIN SMALL LETTER U WITH RING ABOVE - u'\u0170' # 0xF4 -> LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - u'\u0171' # 0xF5 -> LATIN SMALL LETTER U WITH DOUBLE ACUTE - u'\u0172' # 0xF6 -> LATIN CAPITAL LETTER U WITH OGONEK - u'\u0173' # 0xF7 -> LATIN SMALL LETTER U WITH OGONEK - u'\xdd' # 0xF8 -> LATIN CAPITAL LETTER Y WITH ACUTE - u'\xfd' # 0xF9 -> LATIN SMALL LETTER Y WITH ACUTE - u'\u0137' # 0xFA -> LATIN SMALL LETTER K WITH CEDILLA - u'\u017b' # 0xFB -> LATIN CAPITAL LETTER Z WITH DOT ABOVE - u'\u0141' # 0xFC -> LATIN CAPITAL LETTER L WITH STROKE - u'\u017c' # 0xFD -> LATIN SMALL LETTER Z WITH DOT ABOVE - u'\u0122' # 0xFE -> LATIN CAPITAL LETTER G WITH CEDILLA - u'\u02c7' # 0xFF -> CARON -) - -### Encoding table -encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/mac_centeuro.pyc b/PythonEnv/2.7/Lib/encodings/mac_centeuro.pyc deleted file mode 100644 index 89a70fce55a9a928932d23893087d45fa6800e49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2912 zcmc&$YkLz#6rNn0rY(2SV%6Y{pwcQ{P(%dMf>oNn16%sJUP=e*~gbK?55!k;^o zZIH;_#|8g4!pMxnBoopCvxCS^l5mg~Sh$GdAbXr725UFT5z<4*?iMGJJzU}93U5*2 zB60~=xVgetRJe&;N)#v8c}NTn@E3I+B9|3(Ual)I>byj*z)edDk>`;XA3p$2@{t~J z(2t%*g7YzeEKGr>ZmlDo3WPdDRg^SE4K#?Io$*wAAe5FBDUcMUsHCJcC99?b?Mg~f zMNN?dF*ThGtZdlS)Knkd8mZY)7p`p-A~mqzR#y|M3pdwo7aFUZcQvmJbj7s}d{e^n zsyn-@{r>nJc*2?o>~kwcY@Hz4jIIS>QXmGvki(k;*8u@oI|;5`M2G}26Pg#luBmZJ zlW>p24I_l&#V~1v>~WC2@aH6&lk~VCdI!kE_UqiUj5ZIX62OoYJENAnT*Q|ENK_Ns z5{mT}TF5Ag7!M(y>db1~4@FheY9l$cba zQO(ac$+VnJz*az=fFaw4`D$+P32*=@g^@vnUT3*WTLg>xl%y(2V6d2|cLAPd$EB)1JC*uslTkeV&41(3l}Y3 zvUJ%44^}RJsOsTI9u2H`?C~d_d}?KI)zi;BySlpOx#!os@Zw7^uYKj!b+4^|eZw0Y zH*F5p)@|APX8l`lZ)*rQHoYT6nz!%RxodaJyRGlNAN@dVlVl~<-VxvPVIrAIcYdU1 zwCu-SpLBov+1}5;*k|OZPWKxFG-nJMXN+_7AU$kcq=U4V_8FJiO*TQlG=8RE(QoKc zI%M3SCyd{WG2?e*f)3Nu#w}AH$zP`@^B3|znELtrnDJeHG=JI5ou{YrKbiw0^a35F z*XR{<;G#KjiC(2+X8!@R{|GxkC+RIZMQ_uabb=jZy{sqyli5Gaa;(qn@6BJ$Pn!Do z`4QI7zBZ1tBkZuLA2s!3rhdlM&zky4Q$J;lnJ#h~8)7Heh^Y^o z`nT*H8)m1C{p=#UWDK$?cAH%>jvB|6;wz93aB(qI=8uuN*$Aqqcy+OqM4Z1pIRPGi;F3J34^>#YvI d!376pu*X7Ec31i;-IeYtSCyx9zV{As{{@O&$y@*c diff --git a/PythonEnv/2.7/Lib/encodings/mac_croatian.py b/PythonEnv/2.7/Lib/encodings/mac_croatian.py deleted file mode 100644 index f57f7b4b3..000000000 --- a/PythonEnv/2.7/Lib/encodings/mac_croatian.py +++ /dev/null @@ -1,307 +0,0 @@ -""" Python Character Mapping Codec mac_croatian generated from 'MAPPINGS/VENDORS/APPLE/CROATIAN.TXT' with gencodec.py. - -"""#" - -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 - -def getregentry(): - return codecs.CodecInfo( - name='mac-croatian', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) - - -### Decoding Table - -decoding_table = ( - u'\x00' # 0x00 -> CONTROL CHARACTER - u'\x01' # 0x01 -> CONTROL CHARACTER - u'\x02' # 0x02 -> CONTROL CHARACTER - u'\x03' # 0x03 -> CONTROL CHARACTER - u'\x04' # 0x04 -> CONTROL CHARACTER - u'\x05' # 0x05 -> CONTROL CHARACTER - u'\x06' # 0x06 -> CONTROL CHARACTER - u'\x07' # 0x07 -> CONTROL CHARACTER - u'\x08' # 0x08 -> CONTROL CHARACTER - u'\t' # 0x09 -> CONTROL CHARACTER - u'\n' # 0x0A -> CONTROL CHARACTER - u'\x0b' # 0x0B -> CONTROL CHARACTER - u'\x0c' # 0x0C -> CONTROL CHARACTER - u'\r' # 0x0D -> CONTROL CHARACTER - u'\x0e' # 0x0E -> CONTROL CHARACTER - u'\x0f' # 0x0F -> CONTROL CHARACTER - u'\x10' # 0x10 -> CONTROL CHARACTER - u'\x11' # 0x11 -> CONTROL CHARACTER - u'\x12' # 0x12 -> CONTROL CHARACTER - u'\x13' # 0x13 -> CONTROL CHARACTER - u'\x14' # 0x14 -> CONTROL CHARACTER - u'\x15' # 0x15 -> CONTROL CHARACTER - u'\x16' # 0x16 -> CONTROL CHARACTER - u'\x17' # 0x17 -> CONTROL CHARACTER - u'\x18' # 0x18 -> CONTROL CHARACTER - u'\x19' # 0x19 -> CONTROL CHARACTER - u'\x1a' # 0x1A -> CONTROL CHARACTER - u'\x1b' # 0x1B -> CONTROL CHARACTER - u'\x1c' # 0x1C -> CONTROL CHARACTER - u'\x1d' # 0x1D -> CONTROL CHARACTER - u'\x1e' # 0x1E -> CONTROL CHARACTER - u'\x1f' # 0x1F -> CONTROL CHARACTER - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> CONTROL CHARACTER - u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE - u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE - u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE - u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE - u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE - u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE - u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE - u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE - u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE - u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u2020' # 0xA0 -> DAGGER - u'\xb0' # 0xA1 -> DEGREE SIGN - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa7' # 0xA4 -> SECTION SIGN - u'\u2022' # 0xA5 -> BULLET - u'\xb6' # 0xA6 -> PILCROW SIGN - u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S - u'\xae' # 0xA8 -> REGISTERED SIGN - u'\u0160' # 0xA9 -> LATIN CAPITAL LETTER S WITH CARON - u'\u2122' # 0xAA -> TRADE MARK SIGN - u'\xb4' # 0xAB -> ACUTE ACCENT - u'\xa8' # 0xAC -> DIAERESIS - u'\u2260' # 0xAD -> NOT EQUAL TO - u'\u017d' # 0xAE -> LATIN CAPITAL LETTER Z WITH CARON - u'\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE - u'\u221e' # 0xB0 -> INFINITY - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - u'\u2206' # 0xB4 -> INCREMENT - u'\xb5' # 0xB5 -> MICRO SIGN - u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL - u'\u2211' # 0xB7 -> N-ARY SUMMATION - u'\u220f' # 0xB8 -> N-ARY PRODUCT - u'\u0161' # 0xB9 -> LATIN SMALL LETTER S WITH CARON - u'\u222b' # 0xBA -> INTEGRAL - u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR - u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR - u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA - u'\u017e' # 0xBE -> LATIN SMALL LETTER Z WITH CARON - u'\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE - u'\xbf' # 0xC0 -> INVERTED QUESTION MARK - u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK - u'\xac' # 0xC2 -> NOT SIGN - u'\u221a' # 0xC3 -> SQUARE ROOT - u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK - u'\u2248' # 0xC5 -> ALMOST EQUAL TO - u'\u0106' # 0xC6 -> LATIN CAPITAL LETTER C WITH ACUTE - u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u010c' # 0xC8 -> LATIN CAPITAL LETTER C WITH CARON - u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - u'\xa0' # 0xCA -> NO-BREAK SPACE - u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE - u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE - u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE - u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE - u'\u0110' # 0xD0 -> LATIN CAPITAL LETTER D WITH STROKE - u'\u2014' # 0xD1 -> EM DASH - u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - u'\xf7' # 0xD6 -> DIVISION SIGN - u'\u25ca' # 0xD7 -> LOZENGE - u'\uf8ff' # 0xD8 -> Apple logo - u'\xa9' # 0xD9 -> COPYRIGHT SIGN - u'\u2044' # 0xDA -> FRACTION SLASH - u'\u20ac' # 0xDB -> EURO SIGN - u'\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - u'\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - u'\xc6' # 0xDE -> LATIN CAPITAL LETTER AE - u'\xbb' # 0xDF -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2013' # 0xE0 -> EN DASH - u'\xb7' # 0xE1 -> MIDDLE DOT - u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK - u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2030' # 0xE4 -> PER MILLE SIGN - u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\u0107' # 0xE6 -> LATIN SMALL LETTER C WITH ACUTE - u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\u010d' # 0xE8 -> LATIN SMALL LETTER C WITH CARON - u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\u0111' # 0xF0 -> LATIN SMALL LETTER D WITH STROKE - u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I - u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT - u'\u02dc' # 0xF7 -> SMALL TILDE - u'\xaf' # 0xF8 -> MACRON - u'\u03c0' # 0xF9 -> GREEK SMALL LETTER PI - u'\xcb' # 0xFA -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\u02da' # 0xFB -> RING ABOVE - u'\xb8' # 0xFC -> CEDILLA - u'\xca' # 0xFD -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xe6' # 0xFE -> LATIN SMALL LETTER AE - u'\u02c7' # 0xFF -> CARON -) - -### Encoding table -encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/mac_croatian.pyc b/PythonEnv/2.7/Lib/encodings/mac_croatian.pyc deleted file mode 100644 index 8b58c6bea2eb5c8f1338beb206954dda1de3c0b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2920 zcmc&$YkLz_5I(s!4J~)jV%6Y{pwcQ{P(-Ap1*CKPU=@Rby9rj#?)DRdqd#{>K&orftCiaM{*Rg`pIrc~0VwTvkfS*uSRfG7D_ z4?5^4Pb0xe6hIEAKy$a=nMnsiow6p!bX5y9$z5HEbVneRQPfx%z0FJ`trcgdrt&MJ;!QNGuVM zs4llBRqHLXkX4g$5kex}mD7bEs-|VMY!H=9Oxd}(3N382FrL4lEtzO2kMZPRgUu?_E=!fb{SQU0EQStzw>h5SNhxrkX<2dW}LIyRiZiHXofG9==q09PXK z1dD9c1&!i~w4AgN7-#T=A%!~@bg6=jR^lWKER&O2Re)_TxS%mAhwjjh_0z}YPFWY>RjS3 zF>@(>krHol7b_yJnc$zDdOKjT8fVl*sVW>I>YMzLR9X4&{h^9pZTnM#gHjtJ`4XJ0 zyJUqUJ zXcsKO{e)d%thS-uDz<8(CbEgW3bTm=(HkRJFVZV4Th*I<5Y4eM9nXl`W}B7h3QEKk zi2#u(OLvrKo!H%>qHEZwb*+0gZnH#b<|ub~9ToWTicfAI5zpatxjo)8U%7umMdidv zlc!9bHhsp-yY8-)0q@I9P_ zQ*av2!jJF+oP!H+9WJn;U!JBL8~J9|x|P$N0uxzUd@4E_34w z^qE(=vD3WBjX`eg(M+u(E94qIU->?#bv4j6=QU{B%fXy52w^Yrfq zd^S30UV<%fcyx1+a*2GVeye0+*k7q3Sq!pyLzJ<|L)}cGa;a0NDET6-s{Z$7Z%#hVgLXD diff --git a/PythonEnv/2.7/Lib/encodings/mac_cyrillic.py b/PythonEnv/2.7/Lib/encodings/mac_cyrillic.py deleted file mode 100644 index 63324a14b..000000000 --- a/PythonEnv/2.7/Lib/encodings/mac_cyrillic.py +++ /dev/null @@ -1,307 +0,0 @@ -""" Python Character Mapping Codec mac_cyrillic generated from 'MAPPINGS/VENDORS/APPLE/CYRILLIC.TXT' with gencodec.py. - -"""#" - -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 - -def getregentry(): - return codecs.CodecInfo( - name='mac-cyrillic', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) - - -### Decoding Table - -decoding_table = ( - u'\x00' # 0x00 -> CONTROL CHARACTER - u'\x01' # 0x01 -> CONTROL CHARACTER - u'\x02' # 0x02 -> CONTROL CHARACTER - u'\x03' # 0x03 -> CONTROL CHARACTER - u'\x04' # 0x04 -> CONTROL CHARACTER - u'\x05' # 0x05 -> CONTROL CHARACTER - u'\x06' # 0x06 -> CONTROL CHARACTER - u'\x07' # 0x07 -> CONTROL CHARACTER - u'\x08' # 0x08 -> CONTROL CHARACTER - u'\t' # 0x09 -> CONTROL CHARACTER - u'\n' # 0x0A -> CONTROL CHARACTER - u'\x0b' # 0x0B -> CONTROL CHARACTER - u'\x0c' # 0x0C -> CONTROL CHARACTER - u'\r' # 0x0D -> CONTROL CHARACTER - u'\x0e' # 0x0E -> CONTROL CHARACTER - u'\x0f' # 0x0F -> CONTROL CHARACTER - u'\x10' # 0x10 -> CONTROL CHARACTER - u'\x11' # 0x11 -> CONTROL CHARACTER - u'\x12' # 0x12 -> CONTROL CHARACTER - u'\x13' # 0x13 -> CONTROL CHARACTER - u'\x14' # 0x14 -> CONTROL CHARACTER - u'\x15' # 0x15 -> CONTROL CHARACTER - u'\x16' # 0x16 -> CONTROL CHARACTER - u'\x17' # 0x17 -> CONTROL CHARACTER - u'\x18' # 0x18 -> CONTROL CHARACTER - u'\x19' # 0x19 -> CONTROL CHARACTER - u'\x1a' # 0x1A -> CONTROL CHARACTER - u'\x1b' # 0x1B -> CONTROL CHARACTER - u'\x1c' # 0x1C -> CONTROL CHARACTER - u'\x1d' # 0x1D -> CONTROL CHARACTER - u'\x1e' # 0x1E -> CONTROL CHARACTER - u'\x1f' # 0x1F -> CONTROL CHARACTER - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> CONTROL CHARACTER - u'\u0410' # 0x80 -> CYRILLIC CAPITAL LETTER A - u'\u0411' # 0x81 -> CYRILLIC CAPITAL LETTER BE - u'\u0412' # 0x82 -> CYRILLIC CAPITAL LETTER VE - u'\u0413' # 0x83 -> CYRILLIC CAPITAL LETTER GHE - u'\u0414' # 0x84 -> CYRILLIC CAPITAL LETTER DE - u'\u0415' # 0x85 -> CYRILLIC CAPITAL LETTER IE - u'\u0416' # 0x86 -> CYRILLIC CAPITAL LETTER ZHE - u'\u0417' # 0x87 -> CYRILLIC CAPITAL LETTER ZE - u'\u0418' # 0x88 -> CYRILLIC CAPITAL LETTER I - u'\u0419' # 0x89 -> CYRILLIC CAPITAL LETTER SHORT I - u'\u041a' # 0x8A -> CYRILLIC CAPITAL LETTER KA - u'\u041b' # 0x8B -> CYRILLIC CAPITAL LETTER EL - u'\u041c' # 0x8C -> CYRILLIC CAPITAL LETTER EM - u'\u041d' # 0x8D -> CYRILLIC CAPITAL LETTER EN - u'\u041e' # 0x8E -> CYRILLIC CAPITAL LETTER O - u'\u041f' # 0x8F -> CYRILLIC CAPITAL LETTER PE - u'\u0420' # 0x90 -> CYRILLIC CAPITAL LETTER ER - u'\u0421' # 0x91 -> CYRILLIC CAPITAL LETTER ES - u'\u0422' # 0x92 -> CYRILLIC CAPITAL LETTER TE - u'\u0423' # 0x93 -> CYRILLIC CAPITAL LETTER U - u'\u0424' # 0x94 -> CYRILLIC CAPITAL LETTER EF - u'\u0425' # 0x95 -> CYRILLIC CAPITAL LETTER HA - u'\u0426' # 0x96 -> CYRILLIC CAPITAL LETTER TSE - u'\u0427' # 0x97 -> CYRILLIC CAPITAL LETTER CHE - u'\u0428' # 0x98 -> CYRILLIC CAPITAL LETTER SHA - u'\u0429' # 0x99 -> CYRILLIC CAPITAL LETTER SHCHA - u'\u042a' # 0x9A -> CYRILLIC CAPITAL LETTER HARD SIGN - u'\u042b' # 0x9B -> CYRILLIC CAPITAL LETTER YERU - u'\u042c' # 0x9C -> CYRILLIC CAPITAL LETTER SOFT SIGN - u'\u042d' # 0x9D -> CYRILLIC CAPITAL LETTER E - u'\u042e' # 0x9E -> CYRILLIC CAPITAL LETTER YU - u'\u042f' # 0x9F -> CYRILLIC CAPITAL LETTER YA - u'\u2020' # 0xA0 -> DAGGER - u'\xb0' # 0xA1 -> DEGREE SIGN - u'\u0490' # 0xA2 -> CYRILLIC CAPITAL LETTER GHE WITH UPTURN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa7' # 0xA4 -> SECTION SIGN - u'\u2022' # 0xA5 -> BULLET - u'\xb6' # 0xA6 -> PILCROW SIGN - u'\u0406' # 0xA7 -> CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - u'\xae' # 0xA8 -> REGISTERED SIGN - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u2122' # 0xAA -> TRADE MARK SIGN - u'\u0402' # 0xAB -> CYRILLIC CAPITAL LETTER DJE - u'\u0452' # 0xAC -> CYRILLIC SMALL LETTER DJE - u'\u2260' # 0xAD -> NOT EQUAL TO - u'\u0403' # 0xAE -> CYRILLIC CAPITAL LETTER GJE - u'\u0453' # 0xAF -> CYRILLIC SMALL LETTER GJE - u'\u221e' # 0xB0 -> INFINITY - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - u'\u0456' # 0xB4 -> CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - u'\xb5' # 0xB5 -> MICRO SIGN - u'\u0491' # 0xB6 -> CYRILLIC SMALL LETTER GHE WITH UPTURN - u'\u0408' # 0xB7 -> CYRILLIC CAPITAL LETTER JE - u'\u0404' # 0xB8 -> CYRILLIC CAPITAL LETTER UKRAINIAN IE - u'\u0454' # 0xB9 -> CYRILLIC SMALL LETTER UKRAINIAN IE - u'\u0407' # 0xBA -> CYRILLIC CAPITAL LETTER YI - u'\u0457' # 0xBB -> CYRILLIC SMALL LETTER YI - u'\u0409' # 0xBC -> CYRILLIC CAPITAL LETTER LJE - u'\u0459' # 0xBD -> CYRILLIC SMALL LETTER LJE - u'\u040a' # 0xBE -> CYRILLIC CAPITAL LETTER NJE - u'\u045a' # 0xBF -> CYRILLIC SMALL LETTER NJE - u'\u0458' # 0xC0 -> CYRILLIC SMALL LETTER JE - u'\u0405' # 0xC1 -> CYRILLIC CAPITAL LETTER DZE - u'\xac' # 0xC2 -> NOT SIGN - u'\u221a' # 0xC3 -> SQUARE ROOT - u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK - u'\u2248' # 0xC5 -> ALMOST EQUAL TO - u'\u2206' # 0xC6 -> INCREMENT - u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - u'\xa0' # 0xCA -> NO-BREAK SPACE - u'\u040b' # 0xCB -> CYRILLIC CAPITAL LETTER TSHE - u'\u045b' # 0xCC -> CYRILLIC SMALL LETTER TSHE - u'\u040c' # 0xCD -> CYRILLIC CAPITAL LETTER KJE - u'\u045c' # 0xCE -> CYRILLIC SMALL LETTER KJE - u'\u0455' # 0xCF -> CYRILLIC SMALL LETTER DZE - u'\u2013' # 0xD0 -> EN DASH - u'\u2014' # 0xD1 -> EM DASH - u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - u'\xf7' # 0xD6 -> DIVISION SIGN - u'\u201e' # 0xD7 -> DOUBLE LOW-9 QUOTATION MARK - u'\u040e' # 0xD8 -> CYRILLIC CAPITAL LETTER SHORT U - u'\u045e' # 0xD9 -> CYRILLIC SMALL LETTER SHORT U - u'\u040f' # 0xDA -> CYRILLIC CAPITAL LETTER DZHE - u'\u045f' # 0xDB -> CYRILLIC SMALL LETTER DZHE - u'\u2116' # 0xDC -> NUMERO SIGN - u'\u0401' # 0xDD -> CYRILLIC CAPITAL LETTER IO - u'\u0451' # 0xDE -> CYRILLIC SMALL LETTER IO - u'\u044f' # 0xDF -> CYRILLIC SMALL LETTER YA - u'\u0430' # 0xE0 -> CYRILLIC SMALL LETTER A - u'\u0431' # 0xE1 -> CYRILLIC SMALL LETTER BE - u'\u0432' # 0xE2 -> CYRILLIC SMALL LETTER VE - u'\u0433' # 0xE3 -> CYRILLIC SMALL LETTER GHE - u'\u0434' # 0xE4 -> CYRILLIC SMALL LETTER DE - u'\u0435' # 0xE5 -> CYRILLIC SMALL LETTER IE - u'\u0436' # 0xE6 -> CYRILLIC SMALL LETTER ZHE - u'\u0437' # 0xE7 -> CYRILLIC SMALL LETTER ZE - u'\u0438' # 0xE8 -> CYRILLIC SMALL LETTER I - u'\u0439' # 0xE9 -> CYRILLIC SMALL LETTER SHORT I - u'\u043a' # 0xEA -> CYRILLIC SMALL LETTER KA - u'\u043b' # 0xEB -> CYRILLIC SMALL LETTER EL - u'\u043c' # 0xEC -> CYRILLIC SMALL LETTER EM - u'\u043d' # 0xED -> CYRILLIC SMALL LETTER EN - u'\u043e' # 0xEE -> CYRILLIC SMALL LETTER O - u'\u043f' # 0xEF -> CYRILLIC SMALL LETTER PE - u'\u0440' # 0xF0 -> CYRILLIC SMALL LETTER ER - u'\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES - u'\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE - u'\u0443' # 0xF3 -> CYRILLIC SMALL LETTER U - u'\u0444' # 0xF4 -> CYRILLIC SMALL LETTER EF - u'\u0445' # 0xF5 -> CYRILLIC SMALL LETTER HA - u'\u0446' # 0xF6 -> CYRILLIC SMALL LETTER TSE - u'\u0447' # 0xF7 -> CYRILLIC SMALL LETTER CHE - u'\u0448' # 0xF8 -> CYRILLIC SMALL LETTER SHA - u'\u0449' # 0xF9 -> CYRILLIC SMALL LETTER SHCHA - u'\u044a' # 0xFA -> CYRILLIC SMALL LETTER HARD SIGN - u'\u044b' # 0xFB -> CYRILLIC SMALL LETTER YERU - u'\u044c' # 0xFC -> CYRILLIC SMALL LETTER SOFT SIGN - u'\u044d' # 0xFD -> CYRILLIC SMALL LETTER E - u'\u044e' # 0xFE -> CYRILLIC SMALL LETTER YU - u'\u20ac' # 0xFF -> EURO SIGN -) - -### Encoding table -encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/mac_cyrillic.pyc b/PythonEnv/2.7/Lib/encodings/mac_cyrillic.pyc deleted file mode 100644 index aa1474313f03f50ec6a5b38b97a56974b9e5f89e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2910 zcmc&$dv_C65Wjgg4J~ibV%6ZQL8VoEpoj>Bg4H(E4f3efxZT~fi+R+|My#R+8lVN_ zS)k=nYI%tuf(oekI47Rt-*fp0`xX2EICGa|3;IvNqnqB_duOtDW`6U#Gx7Xc9V~3m zwJ7Z7TB z$fl--5=JH!s%u%&+S(Ld5o=i87+tnfiZ$TAxv?R#PHJjyZi>{eTDz()v_Ut!=uL&r ztMBfq4+ixc_(V+~+80*J*t$`&lw1qpq+tw*p@6r5t|J1tb~9Rgm=p_BCQLtl-86K? zRA^7biz7nfX*ijTt#`4F_~&M(oAr7ydKb#0&g;UntT_>-3c`?*yW_UILL`<5NZgb= zlA8S%S;%V1ga|=Tcjrvuhh`WVBO68~6H|5$t|ANCZH(v5Z%^tS?WOaw?PIY;VC*9V zP7~;S0)x5kBr1tsy(J!m9^n@vvAi`Ni83J(l2QducNKtbiLksGK$yTX131OwX*s3E z<7QB7QW-Uu#H~a+i9&V^i`Dqxlkfmmi6ct}{q8D{ITaU8X~ob|TH2J8jRIRkL8*Ak zY@3c-n{9aCROT>@i1POY%tEO{E94h4%R|hADE>=WbGr>P6^-jQIHO{DsQZ+b4)VKH}X|np?`$HAI*72td2cKzo}63X@YK`uo_Y4U=jXrh;)0hJzP#v_ z#Y>h(mNhP4@oLj+uQ#_uSGK+(#a6w!dd=E(ZEv-|{Z9N{xkFL4L}!=2{=H->o#}qx z$eOtiHhkFg(Z?G<`Sdf`1AAc~?1uq300-d^48jl`h9htkj=?Y-hY|P!M&SgUgi~-D z&cK&&7QTXWa2~#f3-FDVA1PkEzNdJic*e?)7O%k8;)UW_t1t?i`97?t8ch? z$?898^`GJgif@tT!CT^xZO z{0QviNBIFOzu(FaSoxz?{+N{?wDLp0U$yeXu!|4FZhqV<9E44LFW(Ip;Szic-@*5A z8Lq%p_yK-|pWqt&48Opy@EgzbO?)%&R}QUNt60R>1R(zPEV?KheGKXPK~c@h;F~o?(d5{cu+Z!qs)Sxm}i diff --git a/PythonEnv/2.7/Lib/encodings/mac_farsi.py b/PythonEnv/2.7/Lib/encodings/mac_farsi.py deleted file mode 100644 index 9dbd76a23..000000000 --- a/PythonEnv/2.7/Lib/encodings/mac_farsi.py +++ /dev/null @@ -1,307 +0,0 @@ -""" Python Character Mapping Codec mac_farsi generated from 'MAPPINGS/VENDORS/APPLE/FARSI.TXT' with gencodec.py. - -"""#" - -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 - -def getregentry(): - return codecs.CodecInfo( - name='mac-farsi', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) - - -### Decoding Table - -decoding_table = ( - u'\x00' # 0x00 -> CONTROL CHARACTER - u'\x01' # 0x01 -> CONTROL CHARACTER - u'\x02' # 0x02 -> CONTROL CHARACTER - u'\x03' # 0x03 -> CONTROL CHARACTER - u'\x04' # 0x04 -> CONTROL CHARACTER - u'\x05' # 0x05 -> CONTROL CHARACTER - u'\x06' # 0x06 -> CONTROL CHARACTER - u'\x07' # 0x07 -> CONTROL CHARACTER - u'\x08' # 0x08 -> CONTROL CHARACTER - u'\t' # 0x09 -> CONTROL CHARACTER - u'\n' # 0x0A -> CONTROL CHARACTER - u'\x0b' # 0x0B -> CONTROL CHARACTER - u'\x0c' # 0x0C -> CONTROL CHARACTER - u'\r' # 0x0D -> CONTROL CHARACTER - u'\x0e' # 0x0E -> CONTROL CHARACTER - u'\x0f' # 0x0F -> CONTROL CHARACTER - u'\x10' # 0x10 -> CONTROL CHARACTER - u'\x11' # 0x11 -> CONTROL CHARACTER - u'\x12' # 0x12 -> CONTROL CHARACTER - u'\x13' # 0x13 -> CONTROL CHARACTER - u'\x14' # 0x14 -> CONTROL CHARACTER - u'\x15' # 0x15 -> CONTROL CHARACTER - u'\x16' # 0x16 -> CONTROL CHARACTER - u'\x17' # 0x17 -> CONTROL CHARACTER - u'\x18' # 0x18 -> CONTROL CHARACTER - u'\x19' # 0x19 -> CONTROL CHARACTER - u'\x1a' # 0x1A -> CONTROL CHARACTER - u'\x1b' # 0x1B -> CONTROL CHARACTER - u'\x1c' # 0x1C -> CONTROL CHARACTER - u'\x1d' # 0x1D -> CONTROL CHARACTER - u'\x1e' # 0x1E -> CONTROL CHARACTER - u'\x1f' # 0x1F -> CONTROL CHARACTER - u' ' # 0x20 -> SPACE, left-right - u'!' # 0x21 -> EXCLAMATION MARK, left-right - u'"' # 0x22 -> QUOTATION MARK, left-right - u'#' # 0x23 -> NUMBER SIGN, left-right - u'$' # 0x24 -> DOLLAR SIGN, left-right - u'%' # 0x25 -> PERCENT SIGN, left-right - u'&' # 0x26 -> AMPERSAND, left-right - u"'" # 0x27 -> APOSTROPHE, left-right - u'(' # 0x28 -> LEFT PARENTHESIS, left-right - u')' # 0x29 -> RIGHT PARENTHESIS, left-right - u'*' # 0x2A -> ASTERISK, left-right - u'+' # 0x2B -> PLUS SIGN, left-right - u',' # 0x2C -> COMMA, left-right; in Arabic-script context, displayed as 0x066C ARABIC THOUSANDS SEPARATOR - u'-' # 0x2D -> HYPHEN-MINUS, left-right - u'.' # 0x2E -> FULL STOP, left-right; in Arabic-script context, displayed as 0x066B ARABIC DECIMAL SEPARATOR - u'/' # 0x2F -> SOLIDUS, left-right - u'0' # 0x30 -> DIGIT ZERO; in Arabic-script context, displayed as 0x06F0 EXTENDED ARABIC-INDIC DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE; in Arabic-script context, displayed as 0x06F1 EXTENDED ARABIC-INDIC DIGIT ONE - u'2' # 0x32 -> DIGIT TWO; in Arabic-script context, displayed as 0x06F2 EXTENDED ARABIC-INDIC DIGIT TWO - u'3' # 0x33 -> DIGIT THREE; in Arabic-script context, displayed as 0x06F3 EXTENDED ARABIC-INDIC DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR; in Arabic-script context, displayed as 0x06F4 EXTENDED ARABIC-INDIC DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE; in Arabic-script context, displayed as 0x06F5 EXTENDED ARABIC-INDIC DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX; in Arabic-script context, displayed as 0x06F6 EXTENDED ARABIC-INDIC DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN; in Arabic-script context, displayed as 0x06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT; in Arabic-script context, displayed as 0x06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE; in Arabic-script context, displayed as 0x06F9 EXTENDED ARABIC-INDIC DIGIT NINE - u':' # 0x3A -> COLON, left-right - u';' # 0x3B -> SEMICOLON, left-right - u'<' # 0x3C -> LESS-THAN SIGN, left-right - u'=' # 0x3D -> EQUALS SIGN, left-right - u'>' # 0x3E -> GREATER-THAN SIGN, left-right - u'?' # 0x3F -> QUESTION MARK, left-right - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET, left-right - u'\\' # 0x5C -> REVERSE SOLIDUS, left-right - u']' # 0x5D -> RIGHT SQUARE BRACKET, left-right - u'^' # 0x5E -> CIRCUMFLEX ACCENT, left-right - u'_' # 0x5F -> LOW LINE, left-right - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET, left-right - u'|' # 0x7C -> VERTICAL LINE, left-right - u'}' # 0x7D -> RIGHT CURLY BRACKET, left-right - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> CONTROL CHARACTER - u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xa0' # 0x81 -> NO-BREAK SPACE, right-left - u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - u'\u06ba' # 0x8B -> ARABIC LETTER NOON GHUNNA - u'\xab' # 0x8C -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left - u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE - u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE - u'\u2026' # 0x93 -> HORIZONTAL ELLIPSIS, right-left - u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE - u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE - u'\xbb' # 0x98 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK, right-left - u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf7' # 0x9B -> DIVISION SIGN, right-left - u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE - u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE - u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - u' ' # 0xA0 -> SPACE, right-left - u'!' # 0xA1 -> EXCLAMATION MARK, right-left - u'"' # 0xA2 -> QUOTATION MARK, right-left - u'#' # 0xA3 -> NUMBER SIGN, right-left - u'$' # 0xA4 -> DOLLAR SIGN, right-left - u'\u066a' # 0xA5 -> ARABIC PERCENT SIGN - u'&' # 0xA6 -> AMPERSAND, right-left - u"'" # 0xA7 -> APOSTROPHE, right-left - u'(' # 0xA8 -> LEFT PARENTHESIS, right-left - u')' # 0xA9 -> RIGHT PARENTHESIS, right-left - u'*' # 0xAA -> ASTERISK, right-left - u'+' # 0xAB -> PLUS SIGN, right-left - u'\u060c' # 0xAC -> ARABIC COMMA - u'-' # 0xAD -> HYPHEN-MINUS, right-left - u'.' # 0xAE -> FULL STOP, right-left - u'/' # 0xAF -> SOLIDUS, right-left - u'\u06f0' # 0xB0 -> EXTENDED ARABIC-INDIC DIGIT ZERO, right-left (need override) - u'\u06f1' # 0xB1 -> EXTENDED ARABIC-INDIC DIGIT ONE, right-left (need override) - u'\u06f2' # 0xB2 -> EXTENDED ARABIC-INDIC DIGIT TWO, right-left (need override) - u'\u06f3' # 0xB3 -> EXTENDED ARABIC-INDIC DIGIT THREE, right-left (need override) - u'\u06f4' # 0xB4 -> EXTENDED ARABIC-INDIC DIGIT FOUR, right-left (need override) - u'\u06f5' # 0xB5 -> EXTENDED ARABIC-INDIC DIGIT FIVE, right-left (need override) - u'\u06f6' # 0xB6 -> EXTENDED ARABIC-INDIC DIGIT SIX, right-left (need override) - u'\u06f7' # 0xB7 -> EXTENDED ARABIC-INDIC DIGIT SEVEN, right-left (need override) - u'\u06f8' # 0xB8 -> EXTENDED ARABIC-INDIC DIGIT EIGHT, right-left (need override) - u'\u06f9' # 0xB9 -> EXTENDED ARABIC-INDIC DIGIT NINE, right-left (need override) - u':' # 0xBA -> COLON, right-left - u'\u061b' # 0xBB -> ARABIC SEMICOLON - u'<' # 0xBC -> LESS-THAN SIGN, right-left - u'=' # 0xBD -> EQUALS SIGN, right-left - u'>' # 0xBE -> GREATER-THAN SIGN, right-left - u'\u061f' # 0xBF -> ARABIC QUESTION MARK - u'\u274a' # 0xC0 -> EIGHT TEARDROP-SPOKED PROPELLER ASTERISK, right-left - u'\u0621' # 0xC1 -> ARABIC LETTER HAMZA - u'\u0622' # 0xC2 -> ARABIC LETTER ALEF WITH MADDA ABOVE - u'\u0623' # 0xC3 -> ARABIC LETTER ALEF WITH HAMZA ABOVE - u'\u0624' # 0xC4 -> ARABIC LETTER WAW WITH HAMZA ABOVE - u'\u0625' # 0xC5 -> ARABIC LETTER ALEF WITH HAMZA BELOW - u'\u0626' # 0xC6 -> ARABIC LETTER YEH WITH HAMZA ABOVE - u'\u0627' # 0xC7 -> ARABIC LETTER ALEF - u'\u0628' # 0xC8 -> ARABIC LETTER BEH - u'\u0629' # 0xC9 -> ARABIC LETTER TEH MARBUTA - u'\u062a' # 0xCA -> ARABIC LETTER TEH - u'\u062b' # 0xCB -> ARABIC LETTER THEH - u'\u062c' # 0xCC -> ARABIC LETTER JEEM - u'\u062d' # 0xCD -> ARABIC LETTER HAH - u'\u062e' # 0xCE -> ARABIC LETTER KHAH - u'\u062f' # 0xCF -> ARABIC LETTER DAL - u'\u0630' # 0xD0 -> ARABIC LETTER THAL - u'\u0631' # 0xD1 -> ARABIC LETTER REH - u'\u0632' # 0xD2 -> ARABIC LETTER ZAIN - u'\u0633' # 0xD3 -> ARABIC LETTER SEEN - u'\u0634' # 0xD4 -> ARABIC LETTER SHEEN - u'\u0635' # 0xD5 -> ARABIC LETTER SAD - u'\u0636' # 0xD6 -> ARABIC LETTER DAD - u'\u0637' # 0xD7 -> ARABIC LETTER TAH - u'\u0638' # 0xD8 -> ARABIC LETTER ZAH - u'\u0639' # 0xD9 -> ARABIC LETTER AIN - u'\u063a' # 0xDA -> ARABIC LETTER GHAIN - u'[' # 0xDB -> LEFT SQUARE BRACKET, right-left - u'\\' # 0xDC -> REVERSE SOLIDUS, right-left - u']' # 0xDD -> RIGHT SQUARE BRACKET, right-left - u'^' # 0xDE -> CIRCUMFLEX ACCENT, right-left - u'_' # 0xDF -> LOW LINE, right-left - u'\u0640' # 0xE0 -> ARABIC TATWEEL - u'\u0641' # 0xE1 -> ARABIC LETTER FEH - u'\u0642' # 0xE2 -> ARABIC LETTER QAF - u'\u0643' # 0xE3 -> ARABIC LETTER KAF - u'\u0644' # 0xE4 -> ARABIC LETTER LAM - u'\u0645' # 0xE5 -> ARABIC LETTER MEEM - u'\u0646' # 0xE6 -> ARABIC LETTER NOON - u'\u0647' # 0xE7 -> ARABIC LETTER HEH - u'\u0648' # 0xE8 -> ARABIC LETTER WAW - u'\u0649' # 0xE9 -> ARABIC LETTER ALEF MAKSURA - u'\u064a' # 0xEA -> ARABIC LETTER YEH - u'\u064b' # 0xEB -> ARABIC FATHATAN - u'\u064c' # 0xEC -> ARABIC DAMMATAN - u'\u064d' # 0xED -> ARABIC KASRATAN - u'\u064e' # 0xEE -> ARABIC FATHA - u'\u064f' # 0xEF -> ARABIC DAMMA - u'\u0650' # 0xF0 -> ARABIC KASRA - u'\u0651' # 0xF1 -> ARABIC SHADDA - u'\u0652' # 0xF2 -> ARABIC SUKUN - u'\u067e' # 0xF3 -> ARABIC LETTER PEH - u'\u0679' # 0xF4 -> ARABIC LETTER TTEH - u'\u0686' # 0xF5 -> ARABIC LETTER TCHEH - u'\u06d5' # 0xF6 -> ARABIC LETTER AE - u'\u06a4' # 0xF7 -> ARABIC LETTER VEH - u'\u06af' # 0xF8 -> ARABIC LETTER GAF - u'\u0688' # 0xF9 -> ARABIC LETTER DDAL - u'\u0691' # 0xFA -> ARABIC LETTER RREH - u'{' # 0xFB -> LEFT CURLY BRACKET, right-left - u'|' # 0xFC -> VERTICAL LINE, right-left - u'}' # 0xFD -> RIGHT CURLY BRACKET, right-left - u'\u0698' # 0xFE -> ARABIC LETTER JEH - u'\u06d2' # 0xFF -> ARABIC LETTER YEH BARREE -) - -### Encoding table -encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/mac_farsi.pyc b/PythonEnv/2.7/Lib/encodings/mac_farsi.pyc deleted file mode 100644 index 4a8dbf686493ff5f1f5d0a51da11000cdf228219..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2824 zcmc&$=~o+76n|L>Ve77`sHsbdOF`>W#ae*?6)h=FuuDYakeR?>HfJUxTD1yx!Mf0M z^mvYXY%6vFTS}o&sK*byf8tH@t^b05K)v@(lL7Qg@Eo1+9`D_odH3Gm{k?nR__NA8 zGMep-kvoqA{x`wU=3$ZuiNI_llAR=MBmxTuk!@taPU5h3k`Y3N2{|0G6UoID4z6$) z6%HbmafOpBJVk|*NaaMfbDfLC;Q((@=OR)?LFeYW%A(Fqq$=D*%7|1=A|8GKoa7h4F_s4fHX}0t|7fYo$?3!MOBRHvg+>?GZ`h-=MSbOIp$A_v1nXWHO1d2r({*s zWyv2`(@B3_XLDCqM`&-j;Xqrcb-xg9fc?I|ssJqTTsObIpS`1IB&kWUj zy~=HPLb?kq^Ye?S+CkESPWfSy!FxcD13LmvL+r4&6I?rp5Ds7tbT@uoSCyC^!#xfs zj3A0P!lV;2U?WH1&rWnZ8FoP2Hjsy`*STk!UJcS10FV?jQPW*6;!A)cs*Ak|*?bEv zXmTRXLr_wgtj_(ARW+?@0Zj`snCN%z1Mji$t;9F6K;zDcH~ zYy!3d>I96}vdUK_04KoPq#TBZ*4*|=hrR(89jTZqC*_nbCfYcvY7C_ODUxgxY)z8E z1(S$HEab=Eq2CHpi%mc)Ad~|M1sC5J4&bpN1t!Ad=4lX+jvQ72z2oGu@aF7^D=9Hy zg2BLh;A;J08}w?VO^EQ5Yx5d&9R}wCx zv#^HN>B3texv@(?f7PKEdaxi3ld^CCsT0!iT4HU|a0>-_2XAv$Vd7+0tYTs|26eUA ztbHm^B6K52A`HN7nP8A-m76t7G+N~CuOk&t^D<_c74XgpND%?i5HLS$Pp^)2?vueU z=)<}?v<<*{PUFIqGR#aA1*Q{H=VdJLFTkg8sxAmUd zd+)p7zwLnsA9{FuUEq;NAA5X9eZvz^?tJR$XP({l-1Chu?0#|2OHIu!!Pd6+y)SpX z^6I|M(EhI1gmCxk2M!)O9C@SX&9|a&i@h;Pj`#H|1Meh~sdVODRnxQY4Zc70!G}ja z`uGz%vUG+Xrzhzc{f_=f&(bsW939UsE=|%4^b);DC+H--eCz0WdWBBWX*#oXlg`pP zI!_nr0=-Fp=MEYZribhlxR}41pUz*)&*W$G*Yk7v`TULiLL>VDyk$S%`e~G%W#`y0 zY@Ged&a(^bBD=&U*d+UnU1nF<6uZi%*)=x9X4!Q%$L84$w!jv7D8^CaQ{yvZ*cdTB zH;x&{jT6R6W7PP45G|^pFbVItN CONTROL CHARACTER - u'\x01' # 0x01 -> CONTROL CHARACTER - u'\x02' # 0x02 -> CONTROL CHARACTER - u'\x03' # 0x03 -> CONTROL CHARACTER - u'\x04' # 0x04 -> CONTROL CHARACTER - u'\x05' # 0x05 -> CONTROL CHARACTER - u'\x06' # 0x06 -> CONTROL CHARACTER - u'\x07' # 0x07 -> CONTROL CHARACTER - u'\x08' # 0x08 -> CONTROL CHARACTER - u'\t' # 0x09 -> CONTROL CHARACTER - u'\n' # 0x0A -> CONTROL CHARACTER - u'\x0b' # 0x0B -> CONTROL CHARACTER - u'\x0c' # 0x0C -> CONTROL CHARACTER - u'\r' # 0x0D -> CONTROL CHARACTER - u'\x0e' # 0x0E -> CONTROL CHARACTER - u'\x0f' # 0x0F -> CONTROL CHARACTER - u'\x10' # 0x10 -> CONTROL CHARACTER - u'\x11' # 0x11 -> CONTROL CHARACTER - u'\x12' # 0x12 -> CONTROL CHARACTER - u'\x13' # 0x13 -> CONTROL CHARACTER - u'\x14' # 0x14 -> CONTROL CHARACTER - u'\x15' # 0x15 -> CONTROL CHARACTER - u'\x16' # 0x16 -> CONTROL CHARACTER - u'\x17' # 0x17 -> CONTROL CHARACTER - u'\x18' # 0x18 -> CONTROL CHARACTER - u'\x19' # 0x19 -> CONTROL CHARACTER - u'\x1a' # 0x1A -> CONTROL CHARACTER - u'\x1b' # 0x1B -> CONTROL CHARACTER - u'\x1c' # 0x1C -> CONTROL CHARACTER - u'\x1d' # 0x1D -> CONTROL CHARACTER - u'\x1e' # 0x1E -> CONTROL CHARACTER - u'\x1f' # 0x1F -> CONTROL CHARACTER - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> CONTROL CHARACTER - u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xb9' # 0x81 -> SUPERSCRIPT ONE - u'\xb2' # 0x82 -> SUPERSCRIPT TWO - u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xb3' # 0x84 -> SUPERSCRIPT THREE - u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\u0385' # 0x87 -> GREEK DIALYTIKA TONOS - u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - u'\u0384' # 0x8B -> GREEK TONOS - u'\xa8' # 0x8C -> DIAERESIS - u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE - u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xa3' # 0x92 -> POUND SIGN - u'\u2122' # 0x93 -> TRADE MARK SIGN - u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\u2022' # 0x96 -> BULLET - u'\xbd' # 0x97 -> VULGAR FRACTION ONE HALF - u'\u2030' # 0x98 -> PER MILLE SIGN - u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xa6' # 0x9B -> BROKEN BAR - u'\u20ac' # 0x9C -> EURO SIGN # before Mac OS 9.2.2, was SOFT HYPHEN - u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE - u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u2020' # 0xA0 -> DAGGER - u'\u0393' # 0xA1 -> GREEK CAPITAL LETTER GAMMA - u'\u0394' # 0xA2 -> GREEK CAPITAL LETTER DELTA - u'\u0398' # 0xA3 -> GREEK CAPITAL LETTER THETA - u'\u039b' # 0xA4 -> GREEK CAPITAL LETTER LAMDA - u'\u039e' # 0xA5 -> GREEK CAPITAL LETTER XI - u'\u03a0' # 0xA6 -> GREEK CAPITAL LETTER PI - u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S - u'\xae' # 0xA8 -> REGISTERED SIGN - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u03a3' # 0xAA -> GREEK CAPITAL LETTER SIGMA - u'\u03aa' # 0xAB -> GREEK CAPITAL LETTER IOTA WITH DIALYTIKA - u'\xa7' # 0xAC -> SECTION SIGN - u'\u2260' # 0xAD -> NOT EQUAL TO - u'\xb0' # 0xAE -> DEGREE SIGN - u'\xb7' # 0xAF -> MIDDLE DOT - u'\u0391' # 0xB0 -> GREEK CAPITAL LETTER ALPHA - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - u'\xa5' # 0xB4 -> YEN SIGN - u'\u0392' # 0xB5 -> GREEK CAPITAL LETTER BETA - u'\u0395' # 0xB6 -> GREEK CAPITAL LETTER EPSILON - u'\u0396' # 0xB7 -> GREEK CAPITAL LETTER ZETA - u'\u0397' # 0xB8 -> GREEK CAPITAL LETTER ETA - u'\u0399' # 0xB9 -> GREEK CAPITAL LETTER IOTA - u'\u039a' # 0xBA -> GREEK CAPITAL LETTER KAPPA - u'\u039c' # 0xBB -> GREEK CAPITAL LETTER MU - u'\u03a6' # 0xBC -> GREEK CAPITAL LETTER PHI - u'\u03ab' # 0xBD -> GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA - u'\u03a8' # 0xBE -> GREEK CAPITAL LETTER PSI - u'\u03a9' # 0xBF -> GREEK CAPITAL LETTER OMEGA - u'\u03ac' # 0xC0 -> GREEK SMALL LETTER ALPHA WITH TONOS - u'\u039d' # 0xC1 -> GREEK CAPITAL LETTER NU - u'\xac' # 0xC2 -> NOT SIGN - u'\u039f' # 0xC3 -> GREEK CAPITAL LETTER OMICRON - u'\u03a1' # 0xC4 -> GREEK CAPITAL LETTER RHO - u'\u2248' # 0xC5 -> ALMOST EQUAL TO - u'\u03a4' # 0xC6 -> GREEK CAPITAL LETTER TAU - u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - u'\xa0' # 0xCA -> NO-BREAK SPACE - u'\u03a5' # 0xCB -> GREEK CAPITAL LETTER UPSILON - u'\u03a7' # 0xCC -> GREEK CAPITAL LETTER CHI - u'\u0386' # 0xCD -> GREEK CAPITAL LETTER ALPHA WITH TONOS - u'\u0388' # 0xCE -> GREEK CAPITAL LETTER EPSILON WITH TONOS - u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE - u'\u2013' # 0xD0 -> EN DASH - u'\u2015' # 0xD1 -> HORIZONTAL BAR - u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - u'\xf7' # 0xD6 -> DIVISION SIGN - u'\u0389' # 0xD7 -> GREEK CAPITAL LETTER ETA WITH TONOS - u'\u038a' # 0xD8 -> GREEK CAPITAL LETTER IOTA WITH TONOS - u'\u038c' # 0xD9 -> GREEK CAPITAL LETTER OMICRON WITH TONOS - u'\u038e' # 0xDA -> GREEK CAPITAL LETTER UPSILON WITH TONOS - u'\u03ad' # 0xDB -> GREEK SMALL LETTER EPSILON WITH TONOS - u'\u03ae' # 0xDC -> GREEK SMALL LETTER ETA WITH TONOS - u'\u03af' # 0xDD -> GREEK SMALL LETTER IOTA WITH TONOS - u'\u03cc' # 0xDE -> GREEK SMALL LETTER OMICRON WITH TONOS - u'\u038f' # 0xDF -> GREEK CAPITAL LETTER OMEGA WITH TONOS - u'\u03cd' # 0xE0 -> GREEK SMALL LETTER UPSILON WITH TONOS - u'\u03b1' # 0xE1 -> GREEK SMALL LETTER ALPHA - u'\u03b2' # 0xE2 -> GREEK SMALL LETTER BETA - u'\u03c8' # 0xE3 -> GREEK SMALL LETTER PSI - u'\u03b4' # 0xE4 -> GREEK SMALL LETTER DELTA - u'\u03b5' # 0xE5 -> GREEK SMALL LETTER EPSILON - u'\u03c6' # 0xE6 -> GREEK SMALL LETTER PHI - u'\u03b3' # 0xE7 -> GREEK SMALL LETTER GAMMA - u'\u03b7' # 0xE8 -> GREEK SMALL LETTER ETA - u'\u03b9' # 0xE9 -> GREEK SMALL LETTER IOTA - u'\u03be' # 0xEA -> GREEK SMALL LETTER XI - u'\u03ba' # 0xEB -> GREEK SMALL LETTER KAPPA - u'\u03bb' # 0xEC -> GREEK SMALL LETTER LAMDA - u'\u03bc' # 0xED -> GREEK SMALL LETTER MU - u'\u03bd' # 0xEE -> GREEK SMALL LETTER NU - u'\u03bf' # 0xEF -> GREEK SMALL LETTER OMICRON - u'\u03c0' # 0xF0 -> GREEK SMALL LETTER PI - u'\u03ce' # 0xF1 -> GREEK SMALL LETTER OMEGA WITH TONOS - u'\u03c1' # 0xF2 -> GREEK SMALL LETTER RHO - u'\u03c3' # 0xF3 -> GREEK SMALL LETTER SIGMA - u'\u03c4' # 0xF4 -> GREEK SMALL LETTER TAU - u'\u03b8' # 0xF5 -> GREEK SMALL LETTER THETA - u'\u03c9' # 0xF6 -> GREEK SMALL LETTER OMEGA - u'\u03c2' # 0xF7 -> GREEK SMALL LETTER FINAL SIGMA - u'\u03c7' # 0xF8 -> GREEK SMALL LETTER CHI - u'\u03c5' # 0xF9 -> GREEK SMALL LETTER UPSILON - u'\u03b6' # 0xFA -> GREEK SMALL LETTER ZETA - u'\u03ca' # 0xFB -> GREEK SMALL LETTER IOTA WITH DIALYTIKA - u'\u03cb' # 0xFC -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA - u'\u0390' # 0xFD -> GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS - u'\u03b0' # 0xFE -> GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS - u'\xad' # 0xFF -> SOFT HYPHEN # before Mac OS 9.2.2, was undefined -) - -### Encoding table -encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/mac_greek.pyc b/PythonEnv/2.7/Lib/encodings/mac_greek.pyc deleted file mode 100644 index 41749d16b88c1961dc40b5d13d2aa5677973cfa5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2864 zcmc&$dv_C65Wjgg4J~ibV%6Y-#s{t914TsWgIb}XZjeW<#%*@f2J)zzt+k30X~3o; zq6mT(simbY@0V08=sCN`e`mkLeg!`O&fKNhQvIj(9NpyJ-aC`MGxM9@ovG{3Qh%!JUPBMCr=y70k=rqQTYbT?%iwWT%6$i}>>1U<68oKrjkLIL+RB%M77-*ZUyBr224*L{ef>jzm;H z-z3vgX9BkZ=>&?`w#rvC08YTSSuu_bS@SweTr?C@t2IiW|fPK8@2A&aFr@zXboiHyu)woS|!VM^(ONjqN0bbM<$z5XA3De)G* z#H?xf3RK_hxMu<_adIh+e}-0=kE(ymTS9cnqzOco5*Jn#SxjzM;#h(Ud?hwk(+?@% z7GJUW;hJ&I*%`M(<*S**OEfCO!Q;Kh89^4M|JWHS+vT=11t2J$H6&k;lXVlVo{Qa< zN;_Ujyo~P2HMUL<-2%x=T>|^7ioMWB1*wM>g@Z($kV@B*YEy=`SddrpHfI+mPWHH6 zOsvMBOcz_VPvJ?#ZiGq1fw)Z(bn&cmvsQ^Fi@g0cq+)4a#%!|!-8q3MA`lt^9Bsbb*sl-hgZdEUv{8LTAJa$mv-&yhw3!>!FY1@f z?4Wkr%wE>7>o>GB=Dzd#O?^VYWo8H92z(32;RpB;2J}1x64Bx;}I0oOr3HToR;S8LEQ5b{sa8f%Dr{E_u-wQ+9Ic>tsp3w$i7)Ia# z^!{`zJSAUS-TLV>>+oljY{b#woPg^ z7GZ3f5JN1kP@fX09IDg?CjX;p?TjZRs|%rY3Ylh5CU`GjYjy8+E<7beEfjmMyUbVS QE_0W=%00#Nymy%UFX0fjPyhe` diff --git a/PythonEnv/2.7/Lib/encodings/mac_iceland.py b/PythonEnv/2.7/Lib/encodings/mac_iceland.py deleted file mode 100644 index c24add2ad..000000000 --- a/PythonEnv/2.7/Lib/encodings/mac_iceland.py +++ /dev/null @@ -1,307 +0,0 @@ -""" Python Character Mapping Codec mac_iceland generated from 'MAPPINGS/VENDORS/APPLE/ICELAND.TXT' with gencodec.py. - -"""#" - -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 - -def getregentry(): - return codecs.CodecInfo( - name='mac-iceland', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) - - -### Decoding Table - -decoding_table = ( - u'\x00' # 0x00 -> CONTROL CHARACTER - u'\x01' # 0x01 -> CONTROL CHARACTER - u'\x02' # 0x02 -> CONTROL CHARACTER - u'\x03' # 0x03 -> CONTROL CHARACTER - u'\x04' # 0x04 -> CONTROL CHARACTER - u'\x05' # 0x05 -> CONTROL CHARACTER - u'\x06' # 0x06 -> CONTROL CHARACTER - u'\x07' # 0x07 -> CONTROL CHARACTER - u'\x08' # 0x08 -> CONTROL CHARACTER - u'\t' # 0x09 -> CONTROL CHARACTER - u'\n' # 0x0A -> CONTROL CHARACTER - u'\x0b' # 0x0B -> CONTROL CHARACTER - u'\x0c' # 0x0C -> CONTROL CHARACTER - u'\r' # 0x0D -> CONTROL CHARACTER - u'\x0e' # 0x0E -> CONTROL CHARACTER - u'\x0f' # 0x0F -> CONTROL CHARACTER - u'\x10' # 0x10 -> CONTROL CHARACTER - u'\x11' # 0x11 -> CONTROL CHARACTER - u'\x12' # 0x12 -> CONTROL CHARACTER - u'\x13' # 0x13 -> CONTROL CHARACTER - u'\x14' # 0x14 -> CONTROL CHARACTER - u'\x15' # 0x15 -> CONTROL CHARACTER - u'\x16' # 0x16 -> CONTROL CHARACTER - u'\x17' # 0x17 -> CONTROL CHARACTER - u'\x18' # 0x18 -> CONTROL CHARACTER - u'\x19' # 0x19 -> CONTROL CHARACTER - u'\x1a' # 0x1A -> CONTROL CHARACTER - u'\x1b' # 0x1B -> CONTROL CHARACTER - u'\x1c' # 0x1C -> CONTROL CHARACTER - u'\x1d' # 0x1D -> CONTROL CHARACTER - u'\x1e' # 0x1E -> CONTROL CHARACTER - u'\x1f' # 0x1F -> CONTROL CHARACTER - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> CONTROL CHARACTER - u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE - u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE - u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE - u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE - u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE - u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE - u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE - u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE - u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE - u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - u'\xdd' # 0xA0 -> LATIN CAPITAL LETTER Y WITH ACUTE - u'\xb0' # 0xA1 -> DEGREE SIGN - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa7' # 0xA4 -> SECTION SIGN - u'\u2022' # 0xA5 -> BULLET - u'\xb6' # 0xA6 -> PILCROW SIGN - u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S - u'\xae' # 0xA8 -> REGISTERED SIGN - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u2122' # 0xAA -> TRADE MARK SIGN - u'\xb4' # 0xAB -> ACUTE ACCENT - u'\xa8' # 0xAC -> DIAERESIS - u'\u2260' # 0xAD -> NOT EQUAL TO - u'\xc6' # 0xAE -> LATIN CAPITAL LETTER AE - u'\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE - u'\u221e' # 0xB0 -> INFINITY - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - u'\xa5' # 0xB4 -> YEN SIGN - u'\xb5' # 0xB5 -> MICRO SIGN - u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL - u'\u2211' # 0xB7 -> N-ARY SUMMATION - u'\u220f' # 0xB8 -> N-ARY PRODUCT - u'\u03c0' # 0xB9 -> GREEK SMALL LETTER PI - u'\u222b' # 0xBA -> INTEGRAL - u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR - u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR - u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA - u'\xe6' # 0xBE -> LATIN SMALL LETTER AE - u'\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE - u'\xbf' # 0xC0 -> INVERTED QUESTION MARK - u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK - u'\xac' # 0xC2 -> NOT SIGN - u'\u221a' # 0xC3 -> SQUARE ROOT - u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK - u'\u2248' # 0xC5 -> ALMOST EQUAL TO - u'\u2206' # 0xC6 -> INCREMENT - u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - u'\xa0' # 0xCA -> NO-BREAK SPACE - u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE - u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE - u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE - u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE - u'\u2013' # 0xD0 -> EN DASH - u'\u2014' # 0xD1 -> EM DASH - u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - u'\xf7' # 0xD6 -> DIVISION SIGN - u'\u25ca' # 0xD7 -> LOZENGE - u'\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS - u'\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS - u'\u2044' # 0xDA -> FRACTION SLASH - u'\u20ac' # 0xDB -> EURO SIGN - u'\xd0' # 0xDC -> LATIN CAPITAL LETTER ETH - u'\xf0' # 0xDD -> LATIN SMALL LETTER ETH - u'\xde' # 0xDE -> LATIN CAPITAL LETTER THORN - u'\xfe' # 0xDF -> LATIN SMALL LETTER THORN - u'\xfd' # 0xE0 -> LATIN SMALL LETTER Y WITH ACUTE - u'\xb7' # 0xE1 -> MIDDLE DOT - u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK - u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2030' # 0xE4 -> PER MILLE SIGN - u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\uf8ff' # 0xF0 -> Apple logo - u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I - u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT - u'\u02dc' # 0xF7 -> SMALL TILDE - u'\xaf' # 0xF8 -> MACRON - u'\u02d8' # 0xF9 -> BREVE - u'\u02d9' # 0xFA -> DOT ABOVE - u'\u02da' # 0xFB -> RING ABOVE - u'\xb8' # 0xFC -> CEDILLA - u'\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT - u'\u02db' # 0xFE -> OGONEK - u'\u02c7' # 0xFF -> CARON -) - -### Encoding table -encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/mac_iceland.pyc b/PythonEnv/2.7/Lib/encodings/mac_iceland.pyc deleted file mode 100644 index 38ae988bd46c2604a06ab7c9ff94d3748d0ec021..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2903 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 CONTROL CHARACTER - u'\x01' # 0x01 -> CONTROL CHARACTER - u'\x02' # 0x02 -> CONTROL CHARACTER - u'\x03' # 0x03 -> CONTROL CHARACTER - u'\x04' # 0x04 -> CONTROL CHARACTER - u'\x05' # 0x05 -> CONTROL CHARACTER - u'\x06' # 0x06 -> CONTROL CHARACTER - u'\x07' # 0x07 -> CONTROL CHARACTER - u'\x08' # 0x08 -> CONTROL CHARACTER - u'\t' # 0x09 -> CONTROL CHARACTER - u'\n' # 0x0A -> CONTROL CHARACTER - u'\x0b' # 0x0B -> CONTROL CHARACTER - u'\x0c' # 0x0C -> CONTROL CHARACTER - u'\r' # 0x0D -> CONTROL CHARACTER - u'\x0e' # 0x0E -> CONTROL CHARACTER - u'\x0f' # 0x0F -> CONTROL CHARACTER - u'\x10' # 0x10 -> CONTROL CHARACTER - u'\x11' # 0x11 -> CONTROL CHARACTER - u'\x12' # 0x12 -> CONTROL CHARACTER - u'\x13' # 0x13 -> CONTROL CHARACTER - u'\x14' # 0x14 -> CONTROL CHARACTER - u'\x15' # 0x15 -> CONTROL CHARACTER - u'\x16' # 0x16 -> CONTROL CHARACTER - u'\x17' # 0x17 -> CONTROL CHARACTER - u'\x18' # 0x18 -> CONTROL CHARACTER - u'\x19' # 0x19 -> CONTROL CHARACTER - u'\x1a' # 0x1A -> CONTROL CHARACTER - u'\x1b' # 0x1B -> CONTROL CHARACTER - u'\x1c' # 0x1C -> CONTROL CHARACTER - u'\x1d' # 0x1D -> CONTROL CHARACTER - u'\x1e' # 0x1E -> CONTROL CHARACTER - u'\x1f' # 0x1F -> CONTROL CHARACTER - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> CONTROL CHARACTER - u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE - u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE - u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE - u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE - u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE - u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE - u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE - u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE - u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE - u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u2020' # 0xA0 -> DAGGER - u'\xb0' # 0xA1 -> DEGREE SIGN - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa7' # 0xA4 -> SECTION SIGN - u'\u2022' # 0xA5 -> BULLET - u'\xb6' # 0xA6 -> PILCROW SIGN - u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S - u'\xae' # 0xA8 -> REGISTERED SIGN - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u2122' # 0xAA -> TRADE MARK SIGN - u'\xb4' # 0xAB -> ACUTE ACCENT - u'\xa8' # 0xAC -> DIAERESIS - u'\u2260' # 0xAD -> NOT EQUAL TO - u'\xc6' # 0xAE -> LATIN CAPITAL LETTER AE - u'\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE - u'\u221e' # 0xB0 -> INFINITY - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - u'\xa5' # 0xB4 -> YEN SIGN - u'\xb5' # 0xB5 -> MICRO SIGN - u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL - u'\u2211' # 0xB7 -> N-ARY SUMMATION - u'\u220f' # 0xB8 -> N-ARY PRODUCT - u'\u03c0' # 0xB9 -> GREEK SMALL LETTER PI - u'\u222b' # 0xBA -> INTEGRAL - u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR - u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR - u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA - u'\xe6' # 0xBE -> LATIN SMALL LETTER AE - u'\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE - u'\xbf' # 0xC0 -> INVERTED QUESTION MARK - u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK - u'\xac' # 0xC2 -> NOT SIGN - u'\u221a' # 0xC3 -> SQUARE ROOT - u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK - u'\u2248' # 0xC5 -> ALMOST EQUAL TO - u'\u2206' # 0xC6 -> INCREMENT - u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - u'\xa0' # 0xCA -> NO-BREAK SPACE - u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE - u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE - u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE - u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE - u'\u2013' # 0xD0 -> EN DASH - u'\u2014' # 0xD1 -> EM DASH - u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - u'\xf7' # 0xD6 -> DIVISION SIGN - u'\u25ca' # 0xD7 -> LOZENGE - u'\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS - u'\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS - u'\u2044' # 0xDA -> FRACTION SLASH - u'\u20ac' # 0xDB -> EURO SIGN - u'\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - u'\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - u'\ufb01' # 0xDE -> LATIN SMALL LIGATURE FI - u'\ufb02' # 0xDF -> LATIN SMALL LIGATURE FL - u'\u2021' # 0xE0 -> DOUBLE DAGGER - u'\xb7' # 0xE1 -> MIDDLE DOT - u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK - u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2030' # 0xE4 -> PER MILLE SIGN - u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\uf8ff' # 0xF0 -> Apple logo - u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I - u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT - u'\u02dc' # 0xF7 -> SMALL TILDE - u'\xaf' # 0xF8 -> MACRON - u'\u02d8' # 0xF9 -> BREVE - u'\u02d9' # 0xFA -> DOT ABOVE - u'\u02da' # 0xFB -> RING ABOVE - u'\xb8' # 0xFC -> CEDILLA - u'\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT - u'\u02db' # 0xFE -> OGONEK - u'\u02c7' # 0xFF -> CARON -) - -### Encoding table -encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/mac_roman.pyc b/PythonEnv/2.7/Lib/encodings/mac_roman.pyc deleted file mode 100644 index ec1651939d1ff12ce3ceaf87232831128ee7a445..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2881 zcmc&$>sM4&6hHH17(sj&Mm6@(=^>OoEHhIPjgo=xkPo7!%iKFKG!MFSi73mvuXpDT0K`hu-hcjg?<*?aEUd;j+D?2YTs zVt;Rcdrg$xdR+K-Eso3tP6}fUI6Ii)WC;grz=eyc4%X^qFss(D~wzhbxIZ&Ba)My|nM zYD(2)T~z`x6a<#ltgEZ54s8loY^e%usFlJMxZhk=A=TEb3zgSzt6vuAi0du%T9i&I zZ|f}g`{Ot93F#iREY8oP>O{$Uaw>q6iryo70@z-38e_+`lhNA6q;QaOpnK`(x)zV> zQQFgRt}0hGTIjA=*_enoHBO(GY0RUFs95g{ zkY>^0gamWkOGpyEdPgvbJ7OR7^MQ7?%jLK454_-`yj!j`*4axQgTv_ zM0CH{B-2WJ0=E+BB#PIzDpoT9PQtfYA&v}L^E!)M`aE1zr=psgR8zW~s1m4ZQIv`& zPqGELwMd2+Okp;$h#!B4elbdIHX*H$P%a`AUi{KXc^jwLwHS7PIO z`XS}p;wu(ETrQ~pi zwszh6$_-T;H@#l{#+#dKLbY{oN#Xjpw`|?Ez2Tk4ci)S=FE>RMHP+k`Z~Y*VOr_gC z)G~VeM;#w`e)8##&pzJ?z3>I>hCbK}-@zaZ!w`(XaX1Di;1ryJ({L6>;YS#Qb8sHU z;b-^>F2ZHF1e0(TuE8(d7&0%IBjz#l6gNi9%kYDF&OF0=N6d@nY2G&kyWk+t9yP~# z-*Mh|!aQMK;@NJV-OICk{xEoU)I4iW{(c5d!WDDM95%;zcHp;tyf4eMyUbDZ8aGaw zLtsD;e0zQ0_5Iwy?*VQMa^na$4szoVOz`jfVe0x7-qp*y$GCBo8@IB?_G6zqcmI1Gn=9nbB`4Vve32XlvV1Ll?7 zk=)_j?jWTT$xMA!Nk_4dQtz=CWb=k7W08j%mqhhZr@k=#FHTc?JfT=^38lBOYX)^g jH22k3J743%Q!><3u?f3NeWmVFcbTiqQ&{4?$=rVda;U#c diff --git a/PythonEnv/2.7/Lib/encodings/mac_romanian.py b/PythonEnv/2.7/Lib/encodings/mac_romanian.py deleted file mode 100644 index 5bd5ae862..000000000 --- a/PythonEnv/2.7/Lib/encodings/mac_romanian.py +++ /dev/null @@ -1,307 +0,0 @@ -""" Python Character Mapping Codec mac_romanian generated from 'MAPPINGS/VENDORS/APPLE/ROMANIAN.TXT' with gencodec.py. - -"""#" - -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 - -def getregentry(): - return codecs.CodecInfo( - name='mac-romanian', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) - - -### Decoding Table - -decoding_table = ( - u'\x00' # 0x00 -> CONTROL CHARACTER - u'\x01' # 0x01 -> CONTROL CHARACTER - u'\x02' # 0x02 -> CONTROL CHARACTER - u'\x03' # 0x03 -> CONTROL CHARACTER - u'\x04' # 0x04 -> CONTROL CHARACTER - u'\x05' # 0x05 -> CONTROL CHARACTER - u'\x06' # 0x06 -> CONTROL CHARACTER - u'\x07' # 0x07 -> CONTROL CHARACTER - u'\x08' # 0x08 -> CONTROL CHARACTER - u'\t' # 0x09 -> CONTROL CHARACTER - u'\n' # 0x0A -> CONTROL CHARACTER - u'\x0b' # 0x0B -> CONTROL CHARACTER - u'\x0c' # 0x0C -> CONTROL CHARACTER - u'\r' # 0x0D -> CONTROL CHARACTER - u'\x0e' # 0x0E -> CONTROL CHARACTER - u'\x0f' # 0x0F -> CONTROL CHARACTER - u'\x10' # 0x10 -> CONTROL CHARACTER - u'\x11' # 0x11 -> CONTROL CHARACTER - u'\x12' # 0x12 -> CONTROL CHARACTER - u'\x13' # 0x13 -> CONTROL CHARACTER - u'\x14' # 0x14 -> CONTROL CHARACTER - u'\x15' # 0x15 -> CONTROL CHARACTER - u'\x16' # 0x16 -> CONTROL CHARACTER - u'\x17' # 0x17 -> CONTROL CHARACTER - u'\x18' # 0x18 -> CONTROL CHARACTER - u'\x19' # 0x19 -> CONTROL CHARACTER - u'\x1a' # 0x1A -> CONTROL CHARACTER - u'\x1b' # 0x1B -> CONTROL CHARACTER - u'\x1c' # 0x1C -> CONTROL CHARACTER - u'\x1d' # 0x1D -> CONTROL CHARACTER - u'\x1e' # 0x1E -> CONTROL CHARACTER - u'\x1f' # 0x1F -> CONTROL CHARACTER - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> CONTROL CHARACTER - u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE - u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE - u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE - u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE - u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE - u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE - u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE - u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE - u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE - u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u2020' # 0xA0 -> DAGGER - u'\xb0' # 0xA1 -> DEGREE SIGN - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa7' # 0xA4 -> SECTION SIGN - u'\u2022' # 0xA5 -> BULLET - u'\xb6' # 0xA6 -> PILCROW SIGN - u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S - u'\xae' # 0xA8 -> REGISTERED SIGN - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u2122' # 0xAA -> TRADE MARK SIGN - u'\xb4' # 0xAB -> ACUTE ACCENT - u'\xa8' # 0xAC -> DIAERESIS - u'\u2260' # 0xAD -> NOT EQUAL TO - u'\u0102' # 0xAE -> LATIN CAPITAL LETTER A WITH BREVE - u'\u0218' # 0xAF -> LATIN CAPITAL LETTER S WITH COMMA BELOW # for Unicode 3.0 and later - u'\u221e' # 0xB0 -> INFINITY - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - u'\xa5' # 0xB4 -> YEN SIGN - u'\xb5' # 0xB5 -> MICRO SIGN - u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL - u'\u2211' # 0xB7 -> N-ARY SUMMATION - u'\u220f' # 0xB8 -> N-ARY PRODUCT - u'\u03c0' # 0xB9 -> GREEK SMALL LETTER PI - u'\u222b' # 0xBA -> INTEGRAL - u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR - u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR - u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA - u'\u0103' # 0xBE -> LATIN SMALL LETTER A WITH BREVE - u'\u0219' # 0xBF -> LATIN SMALL LETTER S WITH COMMA BELOW # for Unicode 3.0 and later - u'\xbf' # 0xC0 -> INVERTED QUESTION MARK - u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK - u'\xac' # 0xC2 -> NOT SIGN - u'\u221a' # 0xC3 -> SQUARE ROOT - u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK - u'\u2248' # 0xC5 -> ALMOST EQUAL TO - u'\u2206' # 0xC6 -> INCREMENT - u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - u'\xa0' # 0xCA -> NO-BREAK SPACE - u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE - u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE - u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE - u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE - u'\u2013' # 0xD0 -> EN DASH - u'\u2014' # 0xD1 -> EM DASH - u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - u'\xf7' # 0xD6 -> DIVISION SIGN - u'\u25ca' # 0xD7 -> LOZENGE - u'\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS - u'\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS - u'\u2044' # 0xDA -> FRACTION SLASH - u'\u20ac' # 0xDB -> EURO SIGN - u'\u2039' # 0xDC -> SINGLE LEFT-POINTING ANGLE QUOTATION MARK - u'\u203a' # 0xDD -> SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - u'\u021a' # 0xDE -> LATIN CAPITAL LETTER T WITH COMMA BELOW # for Unicode 3.0 and later - u'\u021b' # 0xDF -> LATIN SMALL LETTER T WITH COMMA BELOW # for Unicode 3.0 and later - u'\u2021' # 0xE0 -> DOUBLE DAGGER - u'\xb7' # 0xE1 -> MIDDLE DOT - u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK - u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2030' # 0xE4 -> PER MILLE SIGN - u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\uf8ff' # 0xF0 -> Apple logo - u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\u0131' # 0xF5 -> LATIN SMALL LETTER DOTLESS I - u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT - u'\u02dc' # 0xF7 -> SMALL TILDE - u'\xaf' # 0xF8 -> MACRON - u'\u02d8' # 0xF9 -> BREVE - u'\u02d9' # 0xFA -> DOT ABOVE - u'\u02da' # 0xFB -> RING ABOVE - u'\xb8' # 0xFC -> CEDILLA - u'\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT - u'\u02db' # 0xFE -> OGONEK - u'\u02c7' # 0xFF -> CARON -) - -### Encoding table -encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/mac_romanian.pyc b/PythonEnv/2.7/Lib/encodings/mac_romanian.pyc deleted file mode 100644 index 6ecd750519d262ebadd98623335a215de627e0b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2921 zcmc&$d2tts(8Qdez&Wcf#A&IcT zgW^z0xIzFq^FY{U>1Q?7o-xx_4f8|N8g3{5B^<*BYO!ag|QZ#T}*Maq>HuS!oyS-Tjyp8TzgqBV?B(mZE-WjClnr` z@Rt-Grj!YVS11A{g_kMiOmz#Lk0tPcU`gj=%DAG=FLV_pou4U{v}q}0%6Qfi5C`B% z0oH>K2FcTCcmf5G!zt9r37pYmfX63BVdd=vd zH{*0(O=nk4FsR+cCt~=}zOYil){T0(ONzpK6!tm42 z4PA>HaoW@H;;1L_6r2pk*16aQ{JNRpW<4H^-i7jr^SbaXYm7%}9AQYwoiW>8Areaj zBxcBMN!5OfEM(PWLWH2DJ9CEcL)G<+o(-dti77i9SM~E-ZH(v6YfWlxt;O@Qt)sC; zVC*9VPUGl&0)x5kCMtA0?@)U+Wd8w9p` z9HrtZv27}DZMNZkQ<%drBFf(rFaxCyt&m^HEDtdY>p)dBOvgqvoR|n*Bts%z3UDRz zPO!*9UC=0@rRAi9z!-xk3@O~vpi32Gv=S#_V5ywUsse1s%H7~hxt&xr<#*kQ@)AL{ z{|9ACzl}0c><*MADtb=nV+5G^IUUD811wEM)xW@D!gX5F3Svtcj2gNsr&jA4R_79T ziJ6P(hm?4myI2u%%>@6P)H?x-)fl5DN>$+yQQzi|q{_;F?+;bS1NkFwrPt&_$(!m8B$Lt)5ft zgHFK`+}E56W48_cPO)7Rb&*Z%RhUg2h~6l{dXZjX*{0h#&5wy17#{gQ^I%U*AMb(EV!)?BphXcX4wsH}`RKH#hs?690ZHT)%OdZ|ddUr?`2An^#8$ zM)q*?pmm9x1Kixt&9l%ATVWG?33>P$zJYD<73_pve;m3FJ756zK>zT$!sfzW>r7#H zp}#O-T`ue^>?v#sQ! CONTROL CHARACTER - u'\x01' # 0x01 -> CONTROL CHARACTER - u'\x02' # 0x02 -> CONTROL CHARACTER - u'\x03' # 0x03 -> CONTROL CHARACTER - u'\x04' # 0x04 -> CONTROL CHARACTER - u'\x05' # 0x05 -> CONTROL CHARACTER - u'\x06' # 0x06 -> CONTROL CHARACTER - u'\x07' # 0x07 -> CONTROL CHARACTER - u'\x08' # 0x08 -> CONTROL CHARACTER - u'\t' # 0x09 -> CONTROL CHARACTER - u'\n' # 0x0A -> CONTROL CHARACTER - u'\x0b' # 0x0B -> CONTROL CHARACTER - u'\x0c' # 0x0C -> CONTROL CHARACTER - u'\r' # 0x0D -> CONTROL CHARACTER - u'\x0e' # 0x0E -> CONTROL CHARACTER - u'\x0f' # 0x0F -> CONTROL CHARACTER - u'\x10' # 0x10 -> CONTROL CHARACTER - u'\x11' # 0x11 -> CONTROL CHARACTER - u'\x12' # 0x12 -> CONTROL CHARACTER - u'\x13' # 0x13 -> CONTROL CHARACTER - u'\x14' # 0x14 -> CONTROL CHARACTER - u'\x15' # 0x15 -> CONTROL CHARACTER - u'\x16' # 0x16 -> CONTROL CHARACTER - u'\x17' # 0x17 -> CONTROL CHARACTER - u'\x18' # 0x18 -> CONTROL CHARACTER - u'\x19' # 0x19 -> CONTROL CHARACTER - u'\x1a' # 0x1A -> CONTROL CHARACTER - u'\x1b' # 0x1B -> CONTROL CHARACTER - u'\x1c' # 0x1C -> CONTROL CHARACTER - u'\x1d' # 0x1D -> CONTROL CHARACTER - u'\x1e' # 0x1E -> CONTROL CHARACTER - u'\x1f' # 0x1F -> CONTROL CHARACTER - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> CONTROL CHARACTER - u'\xc4' # 0x80 -> LATIN CAPITAL LETTER A WITH DIAERESIS - u'\xc5' # 0x81 -> LATIN CAPITAL LETTER A WITH RING ABOVE - u'\xc7' # 0x82 -> LATIN CAPITAL LETTER C WITH CEDILLA - u'\xc9' # 0x83 -> LATIN CAPITAL LETTER E WITH ACUTE - u'\xd1' # 0x84 -> LATIN CAPITAL LETTER N WITH TILDE - u'\xd6' # 0x85 -> LATIN CAPITAL LETTER O WITH DIAERESIS - u'\xdc' # 0x86 -> LATIN CAPITAL LETTER U WITH DIAERESIS - u'\xe1' # 0x87 -> LATIN SMALL LETTER A WITH ACUTE - u'\xe0' # 0x88 -> LATIN SMALL LETTER A WITH GRAVE - u'\xe2' # 0x89 -> LATIN SMALL LETTER A WITH CIRCUMFLEX - u'\xe4' # 0x8A -> LATIN SMALL LETTER A WITH DIAERESIS - u'\xe3' # 0x8B -> LATIN SMALL LETTER A WITH TILDE - u'\xe5' # 0x8C -> LATIN SMALL LETTER A WITH RING ABOVE - u'\xe7' # 0x8D -> LATIN SMALL LETTER C WITH CEDILLA - u'\xe9' # 0x8E -> LATIN SMALL LETTER E WITH ACUTE - u'\xe8' # 0x8F -> LATIN SMALL LETTER E WITH GRAVE - u'\xea' # 0x90 -> LATIN SMALL LETTER E WITH CIRCUMFLEX - u'\xeb' # 0x91 -> LATIN SMALL LETTER E WITH DIAERESIS - u'\xed' # 0x92 -> LATIN SMALL LETTER I WITH ACUTE - u'\xec' # 0x93 -> LATIN SMALL LETTER I WITH GRAVE - u'\xee' # 0x94 -> LATIN SMALL LETTER I WITH CIRCUMFLEX - u'\xef' # 0x95 -> LATIN SMALL LETTER I WITH DIAERESIS - u'\xf1' # 0x96 -> LATIN SMALL LETTER N WITH TILDE - u'\xf3' # 0x97 -> LATIN SMALL LETTER O WITH ACUTE - u'\xf2' # 0x98 -> LATIN SMALL LETTER O WITH GRAVE - u'\xf4' # 0x99 -> LATIN SMALL LETTER O WITH CIRCUMFLEX - u'\xf6' # 0x9A -> LATIN SMALL LETTER O WITH DIAERESIS - u'\xf5' # 0x9B -> LATIN SMALL LETTER O WITH TILDE - u'\xfa' # 0x9C -> LATIN SMALL LETTER U WITH ACUTE - u'\xf9' # 0x9D -> LATIN SMALL LETTER U WITH GRAVE - u'\xfb' # 0x9E -> LATIN SMALL LETTER U WITH CIRCUMFLEX - u'\xfc' # 0x9F -> LATIN SMALL LETTER U WITH DIAERESIS - u'\u2020' # 0xA0 -> DAGGER - u'\xb0' # 0xA1 -> DEGREE SIGN - u'\xa2' # 0xA2 -> CENT SIGN - u'\xa3' # 0xA3 -> POUND SIGN - u'\xa7' # 0xA4 -> SECTION SIGN - u'\u2022' # 0xA5 -> BULLET - u'\xb6' # 0xA6 -> PILCROW SIGN - u'\xdf' # 0xA7 -> LATIN SMALL LETTER SHARP S - u'\xae' # 0xA8 -> REGISTERED SIGN - u'\xa9' # 0xA9 -> COPYRIGHT SIGN - u'\u2122' # 0xAA -> TRADE MARK SIGN - u'\xb4' # 0xAB -> ACUTE ACCENT - u'\xa8' # 0xAC -> DIAERESIS - u'\u2260' # 0xAD -> NOT EQUAL TO - u'\xc6' # 0xAE -> LATIN CAPITAL LETTER AE - u'\xd8' # 0xAF -> LATIN CAPITAL LETTER O WITH STROKE - u'\u221e' # 0xB0 -> INFINITY - u'\xb1' # 0xB1 -> PLUS-MINUS SIGN - u'\u2264' # 0xB2 -> LESS-THAN OR EQUAL TO - u'\u2265' # 0xB3 -> GREATER-THAN OR EQUAL TO - u'\xa5' # 0xB4 -> YEN SIGN - u'\xb5' # 0xB5 -> MICRO SIGN - u'\u2202' # 0xB6 -> PARTIAL DIFFERENTIAL - u'\u2211' # 0xB7 -> N-ARY SUMMATION - u'\u220f' # 0xB8 -> N-ARY PRODUCT - u'\u03c0' # 0xB9 -> GREEK SMALL LETTER PI - u'\u222b' # 0xBA -> INTEGRAL - u'\xaa' # 0xBB -> FEMININE ORDINAL INDICATOR - u'\xba' # 0xBC -> MASCULINE ORDINAL INDICATOR - u'\u03a9' # 0xBD -> GREEK CAPITAL LETTER OMEGA - u'\xe6' # 0xBE -> LATIN SMALL LETTER AE - u'\xf8' # 0xBF -> LATIN SMALL LETTER O WITH STROKE - u'\xbf' # 0xC0 -> INVERTED QUESTION MARK - u'\xa1' # 0xC1 -> INVERTED EXCLAMATION MARK - u'\xac' # 0xC2 -> NOT SIGN - u'\u221a' # 0xC3 -> SQUARE ROOT - u'\u0192' # 0xC4 -> LATIN SMALL LETTER F WITH HOOK - u'\u2248' # 0xC5 -> ALMOST EQUAL TO - u'\u2206' # 0xC6 -> INCREMENT - u'\xab' # 0xC7 -> LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\xbb' # 0xC8 -> RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - u'\u2026' # 0xC9 -> HORIZONTAL ELLIPSIS - u'\xa0' # 0xCA -> NO-BREAK SPACE - u'\xc0' # 0xCB -> LATIN CAPITAL LETTER A WITH GRAVE - u'\xc3' # 0xCC -> LATIN CAPITAL LETTER A WITH TILDE - u'\xd5' # 0xCD -> LATIN CAPITAL LETTER O WITH TILDE - u'\u0152' # 0xCE -> LATIN CAPITAL LIGATURE OE - u'\u0153' # 0xCF -> LATIN SMALL LIGATURE OE - u'\u2013' # 0xD0 -> EN DASH - u'\u2014' # 0xD1 -> EM DASH - u'\u201c' # 0xD2 -> LEFT DOUBLE QUOTATION MARK - u'\u201d' # 0xD3 -> RIGHT DOUBLE QUOTATION MARK - u'\u2018' # 0xD4 -> LEFT SINGLE QUOTATION MARK - u'\u2019' # 0xD5 -> RIGHT SINGLE QUOTATION MARK - u'\xf7' # 0xD6 -> DIVISION SIGN - u'\u25ca' # 0xD7 -> LOZENGE - u'\xff' # 0xD8 -> LATIN SMALL LETTER Y WITH DIAERESIS - u'\u0178' # 0xD9 -> LATIN CAPITAL LETTER Y WITH DIAERESIS - u'\u011e' # 0xDA -> LATIN CAPITAL LETTER G WITH BREVE - u'\u011f' # 0xDB -> LATIN SMALL LETTER G WITH BREVE - u'\u0130' # 0xDC -> LATIN CAPITAL LETTER I WITH DOT ABOVE - u'\u0131' # 0xDD -> LATIN SMALL LETTER DOTLESS I - u'\u015e' # 0xDE -> LATIN CAPITAL LETTER S WITH CEDILLA - u'\u015f' # 0xDF -> LATIN SMALL LETTER S WITH CEDILLA - u'\u2021' # 0xE0 -> DOUBLE DAGGER - u'\xb7' # 0xE1 -> MIDDLE DOT - u'\u201a' # 0xE2 -> SINGLE LOW-9 QUOTATION MARK - u'\u201e' # 0xE3 -> DOUBLE LOW-9 QUOTATION MARK - u'\u2030' # 0xE4 -> PER MILLE SIGN - u'\xc2' # 0xE5 -> LATIN CAPITAL LETTER A WITH CIRCUMFLEX - u'\xca' # 0xE6 -> LATIN CAPITAL LETTER E WITH CIRCUMFLEX - u'\xc1' # 0xE7 -> LATIN CAPITAL LETTER A WITH ACUTE - u'\xcb' # 0xE8 -> LATIN CAPITAL LETTER E WITH DIAERESIS - u'\xc8' # 0xE9 -> LATIN CAPITAL LETTER E WITH GRAVE - u'\xcd' # 0xEA -> LATIN CAPITAL LETTER I WITH ACUTE - u'\xce' # 0xEB -> LATIN CAPITAL LETTER I WITH CIRCUMFLEX - u'\xcf' # 0xEC -> LATIN CAPITAL LETTER I WITH DIAERESIS - u'\xcc' # 0xED -> LATIN CAPITAL LETTER I WITH GRAVE - u'\xd3' # 0xEE -> LATIN CAPITAL LETTER O WITH ACUTE - u'\xd4' # 0xEF -> LATIN CAPITAL LETTER O WITH CIRCUMFLEX - u'\uf8ff' # 0xF0 -> Apple logo - u'\xd2' # 0xF1 -> LATIN CAPITAL LETTER O WITH GRAVE - u'\xda' # 0xF2 -> LATIN CAPITAL LETTER U WITH ACUTE - u'\xdb' # 0xF3 -> LATIN CAPITAL LETTER U WITH CIRCUMFLEX - u'\xd9' # 0xF4 -> LATIN CAPITAL LETTER U WITH GRAVE - u'\uf8a0' # 0xF5 -> undefined1 - u'\u02c6' # 0xF6 -> MODIFIER LETTER CIRCUMFLEX ACCENT - u'\u02dc' # 0xF7 -> SMALL TILDE - u'\xaf' # 0xF8 -> MACRON - u'\u02d8' # 0xF9 -> BREVE - u'\u02d9' # 0xFA -> DOT ABOVE - u'\u02da' # 0xFB -> RING ABOVE - u'\xb8' # 0xFC -> CEDILLA - u'\u02dd' # 0xFD -> DOUBLE ACUTE ACCENT - u'\u02db' # 0xFE -> OGONEK - u'\u02c7' # 0xFF -> CARON -) - -### Encoding table -encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/mac_turkish.pyc b/PythonEnv/2.7/Lib/encodings/mac_turkish.pyc deleted file mode 100644 index c21227a90c5ef97a0bea4226779fb7d520c19b69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2904 zcmc&$>2nlS5Py4Svn1T0!KjND>p`M;poj|&CeC0(o;7ak_N*k(6N;M&W&8S7$fQ?r{%KCbX^ zg}ikS9r%iJSlP0s~06zdv z3a~D8Fi4(8!&4{#4X03Jr{11PhicnJRgCMh8fp+bI+S!uH%e;Au@Fu&Mt}%%aJ$iQj33u-Mr#ifqG8H|?x&yY zsuI`Zw5Q?4QA^?(IO&XScCl^vbu-<~x;z-W3*`~#b?%v_Pey4RK}d-mF*!{_F5*js zBc_Y3N!fmjENF5v!9!5e9a)|GA**Ue)xxM`eB#U6MJ+bM3l_E{mDZNRd0NXjWDytp z1a5Z{9Zy&=*Zl+~(5rWagUA=c;mf$Psdd`C8u>US;vu8<0$1% zk!mw>Yf}xcn#3G>5lj9F{~VM$oI-LTtvp04ECChKFdZ9FaAG`io(h3T$)Od+X){vV7f z`8LMHuX`{SsM4Q4zDm3RS(WzLUmTb2qH`Ai|VQ@rZ%Vw7Ud#uiIp|< zL(00%TP%gRW}JIY-kosyYGN@HohoqfnD25&kVWY~cZUjjrQ=Q!3`%P)$(Q0}-%7g^ zV-KcckJl3~rnj)hhU%mHAo;0pVAs{LLk6fkb+M9Ym?#v{>55XN(kSm(qUYafe*E_E zM046JPHC~5g?g{pu7xU3C3YxGB@V=HoM0=@EjMfzZE}IP#QJn1!;6|@R-oG_5K#oe zL!cZzNRo95uuVqKu&wKA=Um)s#AfCyb@^Ro`0?{kwx3Ana(lc!e@UP;IH|0B@|3C5 zrq7r;YxYAASIl{&^3lg056ykz$)}!vW?uN&=bnFIepU60FD-cal~-R|`1%`*-dz0F zlDC&GtEpXHw_@e0`gc~ZX^5Azty{lgJY0Z_ zFbu!I&u|&8!WFm{jg@o zM3#7Kp7<;LA^rzH0M5PZ+EM$2YkS5s_s++;XU@IhKlh^BKUYsP+I&L%pP@B>p)*7i z^Z}U;6#)~9E&3o$Gxp1B6FW7lOx7)8NbJ%|3;^NTl+;_sfXn>YaXgm zZEU7ywNqDlW$K$IilR|bSJtTMT0KqOOZ9VFmUU%RTrS$tS@SYqF7wLzVOE#Jbakp` zt}a#DWO+VZt{+7=i#%JXo3v3kF8AJ6o5QlN&MV`r`o)&hm7C+pv^Xo;37>U3jG{O@ z1*+xR<@1GCqp`ktq|S>%X`VMq+s3-ztr@EEuj=Yt>+|um=h&A2i%;A^g#HK}N0-^&I#q0$zj^%L8L(i+9xs`42JHRZj zmMbp@Tjy%m#ITWc%@-JrzP)aF|N5KjBA;Fhvb>r%*9;V#$<`L%hgjb*CJOuq=r5|w z+0s@%Eq;`M+*Xdf>IquIdn{gC#AZlj7Lsm}XRO-SO@id*9Av<8zCe&2mhs7@#52y} zr8Zg~X^t=E{StR$i7<3ZC+X zKcz)uH9K~<{tupYA3HxrlS_MVG5mu_WXCW+w=jGkgDu0zaBvF?324oV)5qM2Ja}y~ zUCn0JCGDH;hn3Iy4DB^mzTwh4o0eBdE4x2RoI~%xA?L{FXm8`vHZ|{ni`mnho%`|i z06RI`Hn=hj<-^5KbpIFw=pKr1t2RobhxEJTLoUwHH!3q^hMJ6oL^1Y#RObF=Jix}W z$e)!d15RAwPykD&=DSR7)$QIiw`y>nUlJ7vFNp@m?ijdYS{ENORHlMUR@Qh%AjSHk zn$^2|MbDarqB(laPqP3}$pI7gPp9%Y}EfwE0Sq<0DUieYxxZCR-hbP^W5Z{CU E0JwRUsQ>@~ diff --git a/PythonEnv/2.7/Lib/encodings/palmos.py b/PythonEnv/2.7/Lib/encodings/palmos.py deleted file mode 100644 index 4b77e2ba9..000000000 --- a/PythonEnv/2.7/Lib/encodings/palmos.py +++ /dev/null @@ -1,83 +0,0 @@ -""" Python Character Mapping Codec for PalmOS 3.5. - -Written by Sjoerd Mullender (sjoerd@acm.org); based on iso8859_15.py. - -"""#" - -import codecs - -### Codec APIs - -class Codec(codecs.Codec): - def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) - - def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_map) - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return codecs.charmap_encode(input,self.errors,encoding_map)[0] - -class IncrementalDecoder(codecs.IncrementalDecoder): - def decode(self, input, final=False): - return codecs.charmap_decode(input,self.errors,decoding_map)[0] - -class StreamWriter(Codec,codecs.StreamWriter): - pass - -class StreamReader(Codec,codecs.StreamReader): - pass - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='palmos', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) - -### Decoding Map - -decoding_map = codecs.make_identity_dict(range(256)) - -# The PalmOS character set is mostly iso-8859-1 with some differences. -decoding_map.update({ - 0x0080: 0x20ac, # EURO SIGN - 0x0082: 0x201a, # SINGLE LOW-9 QUOTATION MARK - 0x0083: 0x0192, # LATIN SMALL LETTER F WITH HOOK - 0x0084: 0x201e, # DOUBLE LOW-9 QUOTATION MARK - 0x0085: 0x2026, # HORIZONTAL ELLIPSIS - 0x0086: 0x2020, # DAGGER - 0x0087: 0x2021, # DOUBLE DAGGER - 0x0088: 0x02c6, # MODIFIER LETTER CIRCUMFLEX ACCENT - 0x0089: 0x2030, # PER MILLE SIGN - 0x008a: 0x0160, # LATIN CAPITAL LETTER S WITH CARON - 0x008b: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 0x008c: 0x0152, # LATIN CAPITAL LIGATURE OE - 0x008d: 0x2666, # BLACK DIAMOND SUIT - 0x008e: 0x2663, # BLACK CLUB SUIT - 0x008f: 0x2665, # BLACK HEART SUIT - 0x0090: 0x2660, # BLACK SPADE SUIT - 0x0091: 0x2018, # LEFT SINGLE QUOTATION MARK - 0x0092: 0x2019, # RIGHT SINGLE QUOTATION MARK - 0x0093: 0x201c, # LEFT DOUBLE QUOTATION MARK - 0x0094: 0x201d, # RIGHT DOUBLE QUOTATION MARK - 0x0095: 0x2022, # BULLET - 0x0096: 0x2013, # EN DASH - 0x0097: 0x2014, # EM DASH - 0x0098: 0x02dc, # SMALL TILDE - 0x0099: 0x2122, # TRADE MARK SIGN - 0x009a: 0x0161, # LATIN SMALL LETTER S WITH CARON - 0x009c: 0x0153, # LATIN SMALL LIGATURE OE - 0x009f: 0x0178, # LATIN CAPITAL LETTER Y WITH DIAERESIS -}) - -### Encoding Map - -encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/PythonEnv/2.7/Lib/encodings/palmos.pyc b/PythonEnv/2.7/Lib/encodings/palmos.pyc deleted file mode 100644 index 08167b89a4fe1f5b4dead18008312009414679df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3041 zcmc&$*=`&~6umv0?XjKB&SJ+7Z3oPR#bm+GN-%a36bYNC=K*0^nzZNEIBjNAcU!~~ z4+w`X>~Dj`$@?3NReAi$ z!Or1|9yuZ^vW(Ud%}CvmWq_<0N7ge^1J21kku8xomouVy>&RM1q3g(s_E<;GI(oZ~ zoM@kzjP>QEh5?FQUtYAo<11L-K-X6g9pue&GHkDyKGA)$van0=tLM#3JjCyn|mx;*4x%K>)NVOX=fP1{=lu z&|3u)4ZmG6O?Jiu=&}%;RM4M1!|@|iuh{^CW_u&Ht1w~M3ZoL7Vw>nB(88sagygg5 zSL(s)N@uiar43?R5eP{hwi9x`h$M)!muNgb`lmP$SSJn(x5wd;e~w+#Z@_Q>|A*N=hDxb=6x0r8JxVYQde@{yfl}_t% zlX+BzM=CsKW{+8osoyn&MXjOog`1POjVM}i`W%!-d<*s)2+|t-?4o%W-e8pIJ)#G6 zfLjSpu6GR^p{er?5d_;7beIFCu<|y}xF0$_vB9DEa64j>Ad`46y z`kcrReL-}a=u4twE}E~1Mu;8|jS)R08YlXiXp-m~q9LMhiH3beMdAof#!Q6 zpKJMns7&-D(OsgSfJ#gV)Wb7NTUDG<7(tS(rMY67l7t=S-+9~c-!hdzL46Q!Rupd` zwhV`UbIsT)Wo5U~RzEf|6K)^qyae!-A~_}C*`|QqZfSeUUP;c?t31u4*U%I)1G$l& Xk=#gbEIXF(8$6utb9(ml?a%)Kz0EZq diff --git a/PythonEnv/2.7/Lib/encodings/ptcp154.py b/PythonEnv/2.7/Lib/encodings/ptcp154.py deleted file mode 100644 index aef897538..000000000 --- a/PythonEnv/2.7/Lib/encodings/ptcp154.py +++ /dev/null @@ -1,175 +0,0 @@ -""" Python Character Mapping Codec generated from 'PTCP154.txt' with gencodec.py. - -Written by Marc-Andre Lemburg (mal@lemburg.com). - -(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. -(c) Copyright 2000 Guido van Rossum. - -"""#" - -import codecs - -### Codec APIs - -class Codec(codecs.Codec): - - def encode(self,input,errors='strict'): - return codecs.charmap_encode(input,errors,encoding_map) - - def decode(self,input,errors='strict'): - return codecs.charmap_decode(input,errors,decoding_map) - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return codecs.charmap_encode(input,self.errors,encoding_map)[0] - -class IncrementalDecoder(codecs.IncrementalDecoder): - def decode(self, input, final=False): - return codecs.charmap_decode(input,self.errors,decoding_map)[0] - -class StreamWriter(Codec,codecs.StreamWriter): - pass - -class StreamReader(Codec,codecs.StreamReader): - pass - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='ptcp154', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) - -### Decoding Map - -decoding_map = codecs.make_identity_dict(range(256)) -decoding_map.update({ - 0x0080: 0x0496, # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER - 0x0081: 0x0492, # CYRILLIC CAPITAL LETTER GHE WITH STROKE - 0x0082: 0x04ee, # CYRILLIC CAPITAL LETTER U WITH MACRON - 0x0083: 0x0493, # CYRILLIC SMALL LETTER GHE WITH STROKE - 0x0084: 0x201e, # DOUBLE LOW-9 QUOTATION MARK - 0x0085: 0x2026, # HORIZONTAL ELLIPSIS - 0x0086: 0x04b6, # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER - 0x0087: 0x04ae, # CYRILLIC CAPITAL LETTER STRAIGHT U - 0x0088: 0x04b2, # CYRILLIC CAPITAL LETTER HA WITH DESCENDER - 0x0089: 0x04af, # CYRILLIC SMALL LETTER STRAIGHT U - 0x008a: 0x04a0, # CYRILLIC CAPITAL LETTER BASHKIR KA - 0x008b: 0x04e2, # CYRILLIC CAPITAL LETTER I WITH MACRON - 0x008c: 0x04a2, # CYRILLIC CAPITAL LETTER EN WITH DESCENDER - 0x008d: 0x049a, # CYRILLIC CAPITAL LETTER KA WITH DESCENDER - 0x008e: 0x04ba, # CYRILLIC CAPITAL LETTER SHHA - 0x008f: 0x04b8, # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE - 0x0090: 0x0497, # CYRILLIC SMALL LETTER ZHE WITH DESCENDER - 0x0091: 0x2018, # LEFT SINGLE QUOTATION MARK - 0x0092: 0x2019, # RIGHT SINGLE QUOTATION MARK - 0x0093: 0x201c, # LEFT DOUBLE QUOTATION MARK - 0x0094: 0x201d, # RIGHT DOUBLE QUOTATION MARK - 0x0095: 0x2022, # BULLET - 0x0096: 0x2013, # EN DASH - 0x0097: 0x2014, # EM DASH - 0x0098: 0x04b3, # CYRILLIC SMALL LETTER HA WITH DESCENDER - 0x0099: 0x04b7, # CYRILLIC SMALL LETTER CHE WITH DESCENDER - 0x009a: 0x04a1, # CYRILLIC SMALL LETTER BASHKIR KA - 0x009b: 0x04e3, # CYRILLIC SMALL LETTER I WITH MACRON - 0x009c: 0x04a3, # CYRILLIC SMALL LETTER EN WITH DESCENDER - 0x009d: 0x049b, # CYRILLIC SMALL LETTER KA WITH DESCENDER - 0x009e: 0x04bb, # CYRILLIC SMALL LETTER SHHA - 0x009f: 0x04b9, # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE - 0x00a1: 0x040e, # CYRILLIC CAPITAL LETTER SHORT U (Byelorussian) - 0x00a2: 0x045e, # CYRILLIC SMALL LETTER SHORT U (Byelorussian) - 0x00a3: 0x0408, # CYRILLIC CAPITAL LETTER JE - 0x00a4: 0x04e8, # CYRILLIC CAPITAL LETTER BARRED O - 0x00a5: 0x0498, # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER - 0x00a6: 0x04b0, # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE - 0x00a8: 0x0401, # CYRILLIC CAPITAL LETTER IO - 0x00aa: 0x04d8, # CYRILLIC CAPITAL LETTER SCHWA - 0x00ad: 0x04ef, # CYRILLIC SMALL LETTER U WITH MACRON - 0x00af: 0x049c, # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE - 0x00b1: 0x04b1, # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE - 0x00b2: 0x0406, # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - 0x00b3: 0x0456, # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - 0x00b4: 0x0499, # CYRILLIC SMALL LETTER ZE WITH DESCENDER - 0x00b5: 0x04e9, # CYRILLIC SMALL LETTER BARRED O - 0x00b8: 0x0451, # CYRILLIC SMALL LETTER IO - 0x00b9: 0x2116, # NUMERO SIGN - 0x00ba: 0x04d9, # CYRILLIC SMALL LETTER SCHWA - 0x00bc: 0x0458, # CYRILLIC SMALL LETTER JE - 0x00bd: 0x04aa, # CYRILLIC CAPITAL LETTER ES WITH DESCENDER - 0x00be: 0x04ab, # CYRILLIC SMALL LETTER ES WITH DESCENDER - 0x00bf: 0x049d, # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE - 0x00c0: 0x0410, # CYRILLIC CAPITAL LETTER A - 0x00c1: 0x0411, # CYRILLIC CAPITAL LETTER BE - 0x00c2: 0x0412, # CYRILLIC CAPITAL LETTER VE - 0x00c3: 0x0413, # CYRILLIC CAPITAL LETTER GHE - 0x00c4: 0x0414, # CYRILLIC CAPITAL LETTER DE - 0x00c5: 0x0415, # CYRILLIC CAPITAL LETTER IE - 0x00c6: 0x0416, # CYRILLIC CAPITAL LETTER ZHE - 0x00c7: 0x0417, # CYRILLIC CAPITAL LETTER ZE - 0x00c8: 0x0418, # CYRILLIC CAPITAL LETTER I - 0x00c9: 0x0419, # CYRILLIC CAPITAL LETTER SHORT I - 0x00ca: 0x041a, # CYRILLIC CAPITAL LETTER KA - 0x00cb: 0x041b, # CYRILLIC CAPITAL LETTER EL - 0x00cc: 0x041c, # CYRILLIC CAPITAL LETTER EM - 0x00cd: 0x041d, # CYRILLIC CAPITAL LETTER EN - 0x00ce: 0x041e, # CYRILLIC CAPITAL LETTER O - 0x00cf: 0x041f, # CYRILLIC CAPITAL LETTER PE - 0x00d0: 0x0420, # CYRILLIC CAPITAL LETTER ER - 0x00d1: 0x0421, # CYRILLIC CAPITAL LETTER ES - 0x00d2: 0x0422, # CYRILLIC CAPITAL LETTER TE - 0x00d3: 0x0423, # CYRILLIC CAPITAL LETTER U - 0x00d4: 0x0424, # CYRILLIC CAPITAL LETTER EF - 0x00d5: 0x0425, # CYRILLIC CAPITAL LETTER HA - 0x00d6: 0x0426, # CYRILLIC CAPITAL LETTER TSE - 0x00d7: 0x0427, # CYRILLIC CAPITAL LETTER CHE - 0x00d8: 0x0428, # CYRILLIC CAPITAL LETTER SHA - 0x00d9: 0x0429, # CYRILLIC CAPITAL LETTER SHCHA - 0x00da: 0x042a, # CYRILLIC CAPITAL LETTER HARD SIGN - 0x00db: 0x042b, # CYRILLIC CAPITAL LETTER YERU - 0x00dc: 0x042c, # CYRILLIC CAPITAL LETTER SOFT SIGN - 0x00dd: 0x042d, # CYRILLIC CAPITAL LETTER E - 0x00de: 0x042e, # CYRILLIC CAPITAL LETTER YU - 0x00df: 0x042f, # CYRILLIC CAPITAL LETTER YA - 0x00e0: 0x0430, # CYRILLIC SMALL LETTER A - 0x00e1: 0x0431, # CYRILLIC SMALL LETTER BE - 0x00e2: 0x0432, # CYRILLIC SMALL LETTER VE - 0x00e3: 0x0433, # CYRILLIC SMALL LETTER GHE - 0x00e4: 0x0434, # CYRILLIC SMALL LETTER DE - 0x00e5: 0x0435, # CYRILLIC SMALL LETTER IE - 0x00e6: 0x0436, # CYRILLIC SMALL LETTER ZHE - 0x00e7: 0x0437, # CYRILLIC SMALL LETTER ZE - 0x00e8: 0x0438, # CYRILLIC SMALL LETTER I - 0x00e9: 0x0439, # CYRILLIC SMALL LETTER SHORT I - 0x00ea: 0x043a, # CYRILLIC SMALL LETTER KA - 0x00eb: 0x043b, # CYRILLIC SMALL LETTER EL - 0x00ec: 0x043c, # CYRILLIC SMALL LETTER EM - 0x00ed: 0x043d, # CYRILLIC SMALL LETTER EN - 0x00ee: 0x043e, # CYRILLIC SMALL LETTER O - 0x00ef: 0x043f, # CYRILLIC SMALL LETTER PE - 0x00f0: 0x0440, # CYRILLIC SMALL LETTER ER - 0x00f1: 0x0441, # CYRILLIC SMALL LETTER ES - 0x00f2: 0x0442, # CYRILLIC SMALL LETTER TE - 0x00f3: 0x0443, # CYRILLIC SMALL LETTER U - 0x00f4: 0x0444, # CYRILLIC SMALL LETTER EF - 0x00f5: 0x0445, # CYRILLIC SMALL LETTER HA - 0x00f6: 0x0446, # CYRILLIC SMALL LETTER TSE - 0x00f7: 0x0447, # CYRILLIC SMALL LETTER CHE - 0x00f8: 0x0448, # CYRILLIC SMALL LETTER SHA - 0x00f9: 0x0449, # CYRILLIC SMALL LETTER SHCHA - 0x00fa: 0x044a, # CYRILLIC SMALL LETTER HARD SIGN - 0x00fb: 0x044b, # CYRILLIC SMALL LETTER YERU - 0x00fc: 0x044c, # CYRILLIC SMALL LETTER SOFT SIGN - 0x00fd: 0x044d, # CYRILLIC SMALL LETTER E - 0x00fe: 0x044e, # CYRILLIC SMALL LETTER YU - 0x00ff: 0x044f, # CYRILLIC SMALL LETTER YA -}) - -### Encoding Map - -encoding_map = codecs.make_encoding_map(decoding_map) diff --git a/PythonEnv/2.7/Lib/encodings/ptcp154.pyc b/PythonEnv/2.7/Lib/encodings/ptcp154.pyc deleted file mode 100644 index 7f8095aeed0eb4c16d781124a10475d2f90f9493..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4865 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 At^fc4 diff --git a/PythonEnv/2.7/Lib/encodings/punycode.py b/PythonEnv/2.7/Lib/encodings/punycode.py deleted file mode 100644 index d97200fd3..000000000 --- a/PythonEnv/2.7/Lib/encodings/punycode.py +++ /dev/null @@ -1,238 +0,0 @@ -# -*- coding: iso-8859-1 -*- -""" Codec for the Punicode encoding, as specified in RFC 3492 - -Written by Martin v. Lwis. -""" - -import codecs - -##################### Encoding ##################################### - -def segregate(str): - """3.1 Basic code point segregation""" - base = [] - extended = {} - for c in str: - if ord(c) < 128: - base.append(c) - else: - extended[c] = 1 - extended = extended.keys() - extended.sort() - return "".join(base).encode("ascii"),extended - -def selective_len(str, max): - """Return the length of str, considering only characters below max.""" - res = 0 - for c in str: - if ord(c) < max: - res += 1 - return res - -def selective_find(str, char, index, pos): - """Return a pair (index, pos), indicating the next occurrence of - char in str. index is the position of the character considering - only ordinals up to and including char, and pos is the position in - the full string. index/pos is the starting position in the full - string.""" - - l = len(str) - while 1: - pos += 1 - if pos == l: - return (-1, -1) - c = str[pos] - if c == char: - return index+1, pos - elif c < char: - index += 1 - -def insertion_unsort(str, extended): - """3.2 Insertion unsort coding""" - oldchar = 0x80 - result = [] - oldindex = -1 - for c in extended: - index = pos = -1 - char = ord(c) - curlen = selective_len(str, char) - delta = (curlen+1) * (char - oldchar) - while 1: - index,pos = selective_find(str,c,index,pos) - if index == -1: - break - delta += index - oldindex - result.append(delta-1) - oldindex = index - delta = 0 - oldchar = char - - return result - -def T(j, bias): - # Punycode parameters: tmin = 1, tmax = 26, base = 36 - res = 36 * (j + 1) - bias - if res < 1: return 1 - if res > 26: return 26 - return res - -digits = "abcdefghijklmnopqrstuvwxyz0123456789" -def generate_generalized_integer(N, bias): - """3.3 Generalized variable-length integers""" - result = [] - j = 0 - while 1: - t = T(j, bias) - if N < t: - result.append(digits[N]) - return result - result.append(digits[t + ((N - t) % (36 - t))]) - N = (N - t) // (36 - t) - j += 1 - -def adapt(delta, first, numchars): - if first: - delta //= 700 - else: - delta //= 2 - delta += delta // numchars - # ((base - tmin) * tmax) // 2 == 455 - divisions = 0 - while delta > 455: - delta = delta // 35 # base - tmin - divisions += 36 - bias = divisions + (36 * delta // (delta + 38)) - return bias - - -def generate_integers(baselen, deltas): - """3.4 Bias adaptation""" - # Punycode parameters: initial bias = 72, damp = 700, skew = 38 - result = [] - bias = 72 - for points, delta in enumerate(deltas): - s = generate_generalized_integer(delta, bias) - result.extend(s) - bias = adapt(delta, points==0, baselen+points+1) - return "".join(result) - -def punycode_encode(text): - base, extended = segregate(text) - base = base.encode("ascii") - deltas = insertion_unsort(text, extended) - extended = generate_integers(len(base), deltas) - if base: - return base + "-" + extended - return extended - -##################### Decoding ##################################### - -def decode_generalized_number(extended, extpos, bias, errors): - """3.3 Generalized variable-length integers""" - result = 0 - w = 1 - j = 0 - while 1: - try: - char = ord(extended[extpos]) - except IndexError: - if errors == "strict": - raise UnicodeError, "incomplete punicode string" - return extpos + 1, None - extpos += 1 - if 0x41 <= char <= 0x5A: # A-Z - digit = char - 0x41 - elif 0x30 <= char <= 0x39: - digit = char - 22 # 0x30-26 - elif errors == "strict": - raise UnicodeError("Invalid extended code point '%s'" - % extended[extpos]) - else: - return extpos, None - t = T(j, bias) - result += digit * w - if digit < t: - return extpos, result - w = w * (36 - t) - j += 1 - - -def insertion_sort(base, extended, errors): - """3.2 Insertion unsort coding""" - char = 0x80 - pos = -1 - bias = 72 - extpos = 0 - while extpos < len(extended): - newpos, delta = decode_generalized_number(extended, extpos, - bias, errors) - if delta is None: - # There was an error in decoding. We can't continue because - # synchronization is lost. - return base - pos += delta+1 - char += pos // (len(base) + 1) - if char > 0x10FFFF: - if errors == "strict": - raise UnicodeError, ("Invalid character U+%x" % char) - char = ord('?') - pos = pos % (len(base) + 1) - base = base[:pos] + unichr(char) + base[pos:] - bias = adapt(delta, (extpos == 0), len(base)) - extpos = newpos - return base - -def punycode_decode(text, errors): - pos = text.rfind("-") - if pos == -1: - base = "" - extended = text - else: - base = text[:pos] - extended = text[pos+1:] - base = unicode(base, "ascii", errors) - extended = extended.upper() - return insertion_sort(base, extended, errors) - -### Codec APIs - -class Codec(codecs.Codec): - - def encode(self,input,errors='strict'): - res = punycode_encode(input) - return res, len(input) - - def decode(self,input,errors='strict'): - if errors not in ('strict', 'replace', 'ignore'): - raise UnicodeError, "Unsupported error handling "+errors - res = punycode_decode(input, errors) - return res, len(input) - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return punycode_encode(input) - -class IncrementalDecoder(codecs.IncrementalDecoder): - def decode(self, input, final=False): - if self.errors not in ('strict', 'replace', 'ignore'): - raise UnicodeError, "Unsupported error handling "+self.errors - return punycode_decode(input, self.errors) - -class StreamWriter(Codec,codecs.StreamWriter): - pass - -class StreamReader(Codec,codecs.StreamReader): - pass - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='punycode', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamwriter=StreamWriter, - streamreader=StreamReader, - ) diff --git a/PythonEnv/2.7/Lib/encodings/punycode.pyc b/PythonEnv/2.7/Lib/encodings/punycode.pyc deleted file mode 100644 index d532269c552161bd63d8949bc1c2fb549316a2a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7915 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 WK84?B$_wR*g|UUw!ti2oap>RC3J~D{ diff --git a/PythonEnv/2.7/Lib/encodings/quopri_codec.py b/PythonEnv/2.7/Lib/encodings/quopri_codec.py deleted file mode 100644 index d8683fd56..000000000 --- a/PythonEnv/2.7/Lib/encodings/quopri_codec.py +++ /dev/null @@ -1,75 +0,0 @@ -"""Codec for quoted-printable encoding. - -Like base64 and rot13, this returns Python strings, not Unicode. -""" - -import codecs, quopri -try: - from cStringIO import StringIO -except ImportError: - from StringIO import StringIO - -def quopri_encode(input, errors='strict'): - """Encode the input, returning a tuple (output object, length consumed). - - errors defines the error handling to apply. It defaults to - 'strict' handling which is the only currently supported - error handling for this codec. - - """ - assert errors == 'strict' - # using str() because of cStringIO's Unicode undesired Unicode behavior. - f = StringIO(str(input)) - g = StringIO() - quopri.encode(f, g, 1) - output = g.getvalue() - return (output, len(input)) - -def quopri_decode(input, errors='strict'): - """Decode the input, returning a tuple (output object, length consumed). - - errors defines the error handling to apply. It defaults to - 'strict' handling which is the only currently supported - error handling for this codec. - - """ - assert errors == 'strict' - f = StringIO(str(input)) - g = StringIO() - quopri.decode(f, g) - output = g.getvalue() - return (output, len(input)) - -class Codec(codecs.Codec): - - def encode(self, input,errors='strict'): - return quopri_encode(input,errors) - def decode(self, input,errors='strict'): - return quopri_decode(input,errors) - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return quopri_encode(input, self.errors)[0] - -class IncrementalDecoder(codecs.IncrementalDecoder): - def decode(self, input, final=False): - return quopri_decode(input, self.errors)[0] - -class StreamWriter(Codec, codecs.StreamWriter): - pass - -class StreamReader(Codec,codecs.StreamReader): - pass - -# encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='quopri', - encode=quopri_encode, - decode=quopri_decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamwriter=StreamWriter, - streamreader=StreamReader, - ) diff --git a/PythonEnv/2.7/Lib/encodings/quopri_codec.pyc b/PythonEnv/2.7/Lib/encodings/quopri_codec.pyc deleted file mode 100644 index fd916dc1bc86f19195c1272eb998f13369c851f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3560 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 diff --git a/PythonEnv/2.7/Lib/encodings/shift_jis.py b/PythonEnv/2.7/Lib/encodings/shift_jis.py deleted file mode 100644 index 833811727..000000000 --- a/PythonEnv/2.7/Lib/encodings/shift_jis.py +++ /dev/null @@ -1,39 +0,0 @@ -# -# shift_jis.py: Python Unicode Codec for SHIFT_JIS -# -# Written by Hye-Shik Chang -# - -import _codecs_jp, codecs -import _multibytecodec as mbc - -codec = _codecs_jp.getcodec('shift_jis') - -class Codec(codecs.Codec): - encode = codec.encode - decode = codec.decode - -class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, - codecs.IncrementalEncoder): - codec = codec - -class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, - codecs.IncrementalDecoder): - codec = codec - -class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): - codec = codec - -class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): - codec = codec - -def getregentry(): - return codecs.CodecInfo( - name='shift_jis', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) diff --git a/PythonEnv/2.7/Lib/encodings/shift_jis.pyc b/PythonEnv/2.7/Lib/encodings/shift_jis.pyc deleted file mode 100644 index 536622071175bbda42ad14ef66fce1f740b46447..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1775 zcmc&!OK;Oa5FS6`JnA$E0V*JI;DB=Czy%2*R1rAz&=j!AcU6ZP1qVgDHZrN8l9*f#rnnNDq- zrKN3PH&|+u)G=|u`N%rYu)tqLz_^ro;ywtUBA?W-4=MHexNTvH<9xg@acn!XSuFKx z&RbSU_9NNN+7s`yaIhb8sohP+jj@{YywMgyZ?BcS1zO$I> zLFul(D=-ze*%hz~iCifeMOKl~J;rwlrTk5>C;%;`GYlB3XZds~_}cwkaXBll8pTE` zj>rFl!ye)I%)q)Cpjxb7U|TX+2sjR$5F?P$XJ*w?DkJ0UN(qkxA1_vOn@-kNu#{Ma z?P8KhL&EKHLUA<38O!-Q-=4VJD8$8oD&62!LSP^7-?R@K3C`cdRrN~P6!)on#Ez5j bzG|=^I4dRN_{0g_p8M2qJ5M~GFERcAfhb_S diff --git a/PythonEnv/2.7/Lib/encodings/shift_jis_2004.py b/PythonEnv/2.7/Lib/encodings/shift_jis_2004.py deleted file mode 100644 index 161b1e86f..000000000 --- a/PythonEnv/2.7/Lib/encodings/shift_jis_2004.py +++ /dev/null @@ -1,39 +0,0 @@ -# -# shift_jis_2004.py: Python Unicode Codec for SHIFT_JIS_2004 -# -# Written by Hye-Shik Chang -# - -import _codecs_jp, codecs -import _multibytecodec as mbc - -codec = _codecs_jp.getcodec('shift_jis_2004') - -class Codec(codecs.Codec): - encode = codec.encode - decode = codec.decode - -class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, - codecs.IncrementalEncoder): - codec = codec - -class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, - codecs.IncrementalDecoder): - codec = codec - -class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): - codec = codec - -class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): - codec = codec - -def getregentry(): - return codecs.CodecInfo( - name='shift_jis_2004', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) diff --git a/PythonEnv/2.7/Lib/encodings/shift_jis_2004.pyc b/PythonEnv/2.7/Lib/encodings/shift_jis_2004.pyc deleted file mode 100644 index 1a0b3b2fb71a266ae2868bf490a1b8c456e1f722..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1815 zcmc&!OK;Oa5FS6`JnAF}0V*JI;1mf7RTUBvLZ~8e=%E$b91vC{EAcw1qu8nJjZn_% ziNDCt;0M4rYP z@NEhliiu_}X`9v%)kuS5(afU>)LgnDS`&Q>Jkm9a9h%ie+@Og~+N;D3(hxx06md($ zjY`}i4S^>bN21}=#39|PG>@pc@cEkr$Mg+|B~N$E)A2#RWdQ* zEGfd%lan{523CKeG5_n8Gj{rEwUV zmMqeRUe0;R3K5@gJWz4Qw2)wdEKh-igeqQv>c1O)S(&RvcKUWWPsT&plw{Ll__yt^ zuUCqV^)U)gr)M=S^AN;&7UgjoXJ$12EH~!&z2jI^-UW8$kpsT6c@m1x-Pg!E&Uk=P z@UfnK*Thc}iNl)6DSWhJBFA)K@_3Z0c%VM*zSf#XQ>g;f?ff5ph=iI=>}tKP4z*KLvU%h7#U^? ze^LxB#i){kO13p$qAb75E)kbY_zKA_@{8Q=FuqGXETso;W;S;{5}2Luw2F diff --git a/PythonEnv/2.7/Lib/encodings/shift_jisx0213.py b/PythonEnv/2.7/Lib/encodings/shift_jisx0213.py deleted file mode 100644 index cb653f530..000000000 --- a/PythonEnv/2.7/Lib/encodings/shift_jisx0213.py +++ /dev/null @@ -1,39 +0,0 @@ -# -# shift_jisx0213.py: Python Unicode Codec for SHIFT_JISX0213 -# -# Written by Hye-Shik Chang -# - -import _codecs_jp, codecs -import _multibytecodec as mbc - -codec = _codecs_jp.getcodec('shift_jisx0213') - -class Codec(codecs.Codec): - encode = codec.encode - decode = codec.decode - -class IncrementalEncoder(mbc.MultibyteIncrementalEncoder, - codecs.IncrementalEncoder): - codec = codec - -class IncrementalDecoder(mbc.MultibyteIncrementalDecoder, - codecs.IncrementalDecoder): - codec = codec - -class StreamReader(Codec, mbc.MultibyteStreamReader, codecs.StreamReader): - codec = codec - -class StreamWriter(Codec, mbc.MultibyteStreamWriter, codecs.StreamWriter): - codec = codec - -def getregentry(): - return codecs.CodecInfo( - name='shift_jisx0213', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) diff --git a/PythonEnv/2.7/Lib/encodings/shift_jisx0213.pyc b/PythonEnv/2.7/Lib/encodings/shift_jisx0213.pyc deleted file mode 100644 index c0e410ffefa8604686656a6988af8f4ba714dd1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1815 zcmc&!OK;Oa5FS6`Jeo8J0V*JI;1mf7(Q-gS2vr0QJ+wlb1Hy`AC0-}B6+4x^5#*en z_>24uegJ$kZk*7Ga|pDE%L23 z-zMLoh$wMM+q8nHMj9N85|1WObLpCBMfBD8NY^NGD5;CMK@*#_SBV>>A%M6k;+BXT zmAFM30#7s!M59d;hjgpbXp@GZ)aZ!Dp=h)#jYHBMUie-1Y0x`_fAMcT7lz5=GM<0N17C0YR@d+k4jW9$uC62@ZgiF3lYS4p}dc55`Z4*CAB=&0}r|`j+i5$~`$)i!KqLGgFYg`k?9970yW@Fr!JT`kaj_dvD#<;4` zy5RMhe~QVVcc4w+LpN~9poxG3V7qG?oux)V3wj0MfhJ+nZ3*0ID+ iaRb{mfSitZWe~7kss30p9a%&XagBPKQ6stnf7I}LRmxYifZ)-|6Tawq71#j)i zKf`}f@T&7ox=GPqY!A)uo1M%gZ{~e7^R4r9%|HKsyqnO)m$6N0M;wkgyvE^B+7*W@j$Y$%DeaTC#n+)JZ{Rn+4y7wg zpC`W6#^+JGhMRF0NsYog$n^t@;M2lVQY2>6(V<|HhndFasC z6{SOCkJKn+FNIwerpF?Rig>1@$oO(Io2SP)ZauzDkYr`nSgrGpbOD<=a3< zXSy(P{!X$f8w6~23jz;WX%OH(Ip_9paCTsnpo^AkoAv4u3qy2h(Kr6GV$&Jd+@irK z#GZQ@3kva$5`lzj5Xy31R^l-*Ryv%H?;p6|N_}quZuFw+<9vcXdP1#0tis0Ydi{kNK&M;{ ztwLujJkv(F7OEhD2g@*wDv};CIky9*%5w39Z!2s|R^Re?LE;l4G{c2|f^?ol nQO$68@~W&98s~yn0kLEQ3S2(z5t=famz#X{j&bspl@4}Dh diff --git a/PythonEnv/2.7/Lib/encodings/tis_620.py b/PythonEnv/2.7/Lib/encodings/tis_620.py deleted file mode 100644 index b2cd22b23..000000000 --- a/PythonEnv/2.7/Lib/encodings/tis_620.py +++ /dev/null @@ -1,307 +0,0 @@ -""" Python Character Mapping Codec tis_620 generated from 'python-mappings/TIS-620.TXT' with gencodec.py. - -"""#" - -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 - -def getregentry(): - return codecs.CodecInfo( - name='tis-620', - encode=Codec().encode, - decode=Codec().decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) - - -### Decoding Table - -decoding_table = ( - u'\x00' # 0x00 -> NULL - u'\x01' # 0x01 -> START OF HEADING - u'\x02' # 0x02 -> START OF TEXT - u'\x03' # 0x03 -> END OF TEXT - u'\x04' # 0x04 -> END OF TRANSMISSION - u'\x05' # 0x05 -> ENQUIRY - u'\x06' # 0x06 -> ACKNOWLEDGE - u'\x07' # 0x07 -> BELL - u'\x08' # 0x08 -> BACKSPACE - u'\t' # 0x09 -> HORIZONTAL TABULATION - u'\n' # 0x0A -> LINE FEED - u'\x0b' # 0x0B -> VERTICAL TABULATION - u'\x0c' # 0x0C -> FORM FEED - u'\r' # 0x0D -> CARRIAGE RETURN - u'\x0e' # 0x0E -> SHIFT OUT - u'\x0f' # 0x0F -> SHIFT IN - u'\x10' # 0x10 -> DATA LINK ESCAPE - u'\x11' # 0x11 -> DEVICE CONTROL ONE - u'\x12' # 0x12 -> DEVICE CONTROL TWO - u'\x13' # 0x13 -> DEVICE CONTROL THREE - u'\x14' # 0x14 -> DEVICE CONTROL FOUR - u'\x15' # 0x15 -> NEGATIVE ACKNOWLEDGE - u'\x16' # 0x16 -> SYNCHRONOUS IDLE - u'\x17' # 0x17 -> END OF TRANSMISSION BLOCK - u'\x18' # 0x18 -> CANCEL - u'\x19' # 0x19 -> END OF MEDIUM - u'\x1a' # 0x1A -> SUBSTITUTE - u'\x1b' # 0x1B -> ESCAPE - u'\x1c' # 0x1C -> FILE SEPARATOR - u'\x1d' # 0x1D -> GROUP SEPARATOR - u'\x1e' # 0x1E -> RECORD SEPARATOR - u'\x1f' # 0x1F -> UNIT SEPARATOR - u' ' # 0x20 -> SPACE - u'!' # 0x21 -> EXCLAMATION MARK - u'"' # 0x22 -> QUOTATION MARK - u'#' # 0x23 -> NUMBER SIGN - u'$' # 0x24 -> DOLLAR SIGN - u'%' # 0x25 -> PERCENT SIGN - u'&' # 0x26 -> AMPERSAND - u"'" # 0x27 -> APOSTROPHE - u'(' # 0x28 -> LEFT PARENTHESIS - u')' # 0x29 -> RIGHT PARENTHESIS - u'*' # 0x2A -> ASTERISK - u'+' # 0x2B -> PLUS SIGN - u',' # 0x2C -> COMMA - u'-' # 0x2D -> HYPHEN-MINUS - u'.' # 0x2E -> FULL STOP - u'/' # 0x2F -> SOLIDUS - u'0' # 0x30 -> DIGIT ZERO - u'1' # 0x31 -> DIGIT ONE - u'2' # 0x32 -> DIGIT TWO - u'3' # 0x33 -> DIGIT THREE - u'4' # 0x34 -> DIGIT FOUR - u'5' # 0x35 -> DIGIT FIVE - u'6' # 0x36 -> DIGIT SIX - u'7' # 0x37 -> DIGIT SEVEN - u'8' # 0x38 -> DIGIT EIGHT - u'9' # 0x39 -> DIGIT NINE - u':' # 0x3A -> COLON - u';' # 0x3B -> SEMICOLON - u'<' # 0x3C -> LESS-THAN SIGN - u'=' # 0x3D -> EQUALS SIGN - u'>' # 0x3E -> GREATER-THAN SIGN - u'?' # 0x3F -> QUESTION MARK - u'@' # 0x40 -> COMMERCIAL AT - u'A' # 0x41 -> LATIN CAPITAL LETTER A - u'B' # 0x42 -> LATIN CAPITAL LETTER B - u'C' # 0x43 -> LATIN CAPITAL LETTER C - u'D' # 0x44 -> LATIN CAPITAL LETTER D - u'E' # 0x45 -> LATIN CAPITAL LETTER E - u'F' # 0x46 -> LATIN CAPITAL LETTER F - u'G' # 0x47 -> LATIN CAPITAL LETTER G - u'H' # 0x48 -> LATIN CAPITAL LETTER H - u'I' # 0x49 -> LATIN CAPITAL LETTER I - u'J' # 0x4A -> LATIN CAPITAL LETTER J - u'K' # 0x4B -> LATIN CAPITAL LETTER K - u'L' # 0x4C -> LATIN CAPITAL LETTER L - u'M' # 0x4D -> LATIN CAPITAL LETTER M - u'N' # 0x4E -> LATIN CAPITAL LETTER N - u'O' # 0x4F -> LATIN CAPITAL LETTER O - u'P' # 0x50 -> LATIN CAPITAL LETTER P - u'Q' # 0x51 -> LATIN CAPITAL LETTER Q - u'R' # 0x52 -> LATIN CAPITAL LETTER R - u'S' # 0x53 -> LATIN CAPITAL LETTER S - u'T' # 0x54 -> LATIN CAPITAL LETTER T - u'U' # 0x55 -> LATIN CAPITAL LETTER U - u'V' # 0x56 -> LATIN CAPITAL LETTER V - u'W' # 0x57 -> LATIN CAPITAL LETTER W - u'X' # 0x58 -> LATIN CAPITAL LETTER X - u'Y' # 0x59 -> LATIN CAPITAL LETTER Y - u'Z' # 0x5A -> LATIN CAPITAL LETTER Z - u'[' # 0x5B -> LEFT SQUARE BRACKET - u'\\' # 0x5C -> REVERSE SOLIDUS - u']' # 0x5D -> RIGHT SQUARE BRACKET - u'^' # 0x5E -> CIRCUMFLEX ACCENT - u'_' # 0x5F -> LOW LINE - u'`' # 0x60 -> GRAVE ACCENT - u'a' # 0x61 -> LATIN SMALL LETTER A - u'b' # 0x62 -> LATIN SMALL LETTER B - u'c' # 0x63 -> LATIN SMALL LETTER C - u'd' # 0x64 -> LATIN SMALL LETTER D - u'e' # 0x65 -> LATIN SMALL LETTER E - u'f' # 0x66 -> LATIN SMALL LETTER F - u'g' # 0x67 -> LATIN SMALL LETTER G - u'h' # 0x68 -> LATIN SMALL LETTER H - u'i' # 0x69 -> LATIN SMALL LETTER I - u'j' # 0x6A -> LATIN SMALL LETTER J - u'k' # 0x6B -> LATIN SMALL LETTER K - u'l' # 0x6C -> LATIN SMALL LETTER L - u'm' # 0x6D -> LATIN SMALL LETTER M - u'n' # 0x6E -> LATIN SMALL LETTER N - u'o' # 0x6F -> LATIN SMALL LETTER O - u'p' # 0x70 -> LATIN SMALL LETTER P - u'q' # 0x71 -> LATIN SMALL LETTER Q - u'r' # 0x72 -> LATIN SMALL LETTER R - u's' # 0x73 -> LATIN SMALL LETTER S - u't' # 0x74 -> LATIN SMALL LETTER T - u'u' # 0x75 -> LATIN SMALL LETTER U - u'v' # 0x76 -> LATIN SMALL LETTER V - u'w' # 0x77 -> LATIN SMALL LETTER W - u'x' # 0x78 -> LATIN SMALL LETTER X - u'y' # 0x79 -> LATIN SMALL LETTER Y - u'z' # 0x7A -> LATIN SMALL LETTER Z - u'{' # 0x7B -> LEFT CURLY BRACKET - u'|' # 0x7C -> VERTICAL LINE - u'}' # 0x7D -> RIGHT CURLY BRACKET - u'~' # 0x7E -> TILDE - u'\x7f' # 0x7F -> DELETE - u'\x80' # 0x80 -> - u'\x81' # 0x81 -> - u'\x82' # 0x82 -> - u'\x83' # 0x83 -> - u'\x84' # 0x84 -> - u'\x85' # 0x85 -> - u'\x86' # 0x86 -> - u'\x87' # 0x87 -> - u'\x88' # 0x88 -> - u'\x89' # 0x89 -> - u'\x8a' # 0x8A -> - u'\x8b' # 0x8B -> - u'\x8c' # 0x8C -> - u'\x8d' # 0x8D -> - u'\x8e' # 0x8E -> - u'\x8f' # 0x8F -> - u'\x90' # 0x90 -> - u'\x91' # 0x91 -> - u'\x92' # 0x92 -> - u'\x93' # 0x93 -> - u'\x94' # 0x94 -> - u'\x95' # 0x95 -> - u'\x96' # 0x96 -> - u'\x97' # 0x97 -> - u'\x98' # 0x98 -> - u'\x99' # 0x99 -> - u'\x9a' # 0x9A -> - u'\x9b' # 0x9B -> - u'\x9c' # 0x9C -> - u'\x9d' # 0x9D -> - u'\x9e' # 0x9E -> - u'\x9f' # 0x9F -> - u'\ufffe' - u'\u0e01' # 0xA1 -> THAI CHARACTER KO KAI - u'\u0e02' # 0xA2 -> THAI CHARACTER KHO KHAI - u'\u0e03' # 0xA3 -> THAI CHARACTER KHO KHUAT - u'\u0e04' # 0xA4 -> THAI CHARACTER KHO KHWAI - u'\u0e05' # 0xA5 -> THAI CHARACTER KHO KHON - u'\u0e06' # 0xA6 -> THAI CHARACTER KHO RAKHANG - u'\u0e07' # 0xA7 -> THAI CHARACTER NGO NGU - u'\u0e08' # 0xA8 -> THAI CHARACTER CHO CHAN - u'\u0e09' # 0xA9 -> THAI CHARACTER CHO CHING - u'\u0e0a' # 0xAA -> THAI CHARACTER CHO CHANG - u'\u0e0b' # 0xAB -> THAI CHARACTER SO SO - u'\u0e0c' # 0xAC -> THAI CHARACTER CHO CHOE - u'\u0e0d' # 0xAD -> THAI CHARACTER YO YING - u'\u0e0e' # 0xAE -> THAI CHARACTER DO CHADA - u'\u0e0f' # 0xAF -> THAI CHARACTER TO PATAK - u'\u0e10' # 0xB0 -> THAI CHARACTER THO THAN - u'\u0e11' # 0xB1 -> THAI CHARACTER THO NANGMONTHO - u'\u0e12' # 0xB2 -> THAI CHARACTER THO PHUTHAO - u'\u0e13' # 0xB3 -> THAI CHARACTER NO NEN - u'\u0e14' # 0xB4 -> THAI CHARACTER DO DEK - u'\u0e15' # 0xB5 -> THAI CHARACTER TO TAO - u'\u0e16' # 0xB6 -> THAI CHARACTER THO THUNG - u'\u0e17' # 0xB7 -> THAI CHARACTER THO THAHAN - u'\u0e18' # 0xB8 -> THAI CHARACTER THO THONG - u'\u0e19' # 0xB9 -> THAI CHARACTER NO NU - u'\u0e1a' # 0xBA -> THAI CHARACTER BO BAIMAI - u'\u0e1b' # 0xBB -> THAI CHARACTER PO PLA - u'\u0e1c' # 0xBC -> THAI CHARACTER PHO PHUNG - u'\u0e1d' # 0xBD -> THAI CHARACTER FO FA - u'\u0e1e' # 0xBE -> THAI CHARACTER PHO PHAN - u'\u0e1f' # 0xBF -> THAI CHARACTER FO FAN - u'\u0e20' # 0xC0 -> THAI CHARACTER PHO SAMPHAO - u'\u0e21' # 0xC1 -> THAI CHARACTER MO MA - u'\u0e22' # 0xC2 -> THAI CHARACTER YO YAK - u'\u0e23' # 0xC3 -> THAI CHARACTER RO RUA - u'\u0e24' # 0xC4 -> THAI CHARACTER RU - u'\u0e25' # 0xC5 -> THAI CHARACTER LO LING - u'\u0e26' # 0xC6 -> THAI CHARACTER LU - u'\u0e27' # 0xC7 -> THAI CHARACTER WO WAEN - u'\u0e28' # 0xC8 -> THAI CHARACTER SO SALA - u'\u0e29' # 0xC9 -> THAI CHARACTER SO RUSI - u'\u0e2a' # 0xCA -> THAI CHARACTER SO SUA - u'\u0e2b' # 0xCB -> THAI CHARACTER HO HIP - u'\u0e2c' # 0xCC -> THAI CHARACTER LO CHULA - u'\u0e2d' # 0xCD -> THAI CHARACTER O ANG - u'\u0e2e' # 0xCE -> THAI CHARACTER HO NOKHUK - u'\u0e2f' # 0xCF -> THAI CHARACTER PAIYANNOI - u'\u0e30' # 0xD0 -> THAI CHARACTER SARA A - u'\u0e31' # 0xD1 -> THAI CHARACTER MAI HAN-AKAT - u'\u0e32' # 0xD2 -> THAI CHARACTER SARA AA - u'\u0e33' # 0xD3 -> THAI CHARACTER SARA AM - u'\u0e34' # 0xD4 -> THAI CHARACTER SARA I - u'\u0e35' # 0xD5 -> THAI CHARACTER SARA II - u'\u0e36' # 0xD6 -> THAI CHARACTER SARA UE - u'\u0e37' # 0xD7 -> THAI CHARACTER SARA UEE - u'\u0e38' # 0xD8 -> THAI CHARACTER SARA U - u'\u0e39' # 0xD9 -> THAI CHARACTER SARA UU - u'\u0e3a' # 0xDA -> THAI CHARACTER PHINTHU - u'\ufffe' - u'\ufffe' - u'\ufffe' - u'\ufffe' - u'\u0e3f' # 0xDF -> THAI CURRENCY SYMBOL BAHT - u'\u0e40' # 0xE0 -> THAI CHARACTER SARA E - u'\u0e41' # 0xE1 -> THAI CHARACTER SARA AE - u'\u0e42' # 0xE2 -> THAI CHARACTER SARA O - u'\u0e43' # 0xE3 -> THAI CHARACTER SARA AI MAIMUAN - u'\u0e44' # 0xE4 -> THAI CHARACTER SARA AI MAIMALAI - u'\u0e45' # 0xE5 -> THAI CHARACTER LAKKHANGYAO - u'\u0e46' # 0xE6 -> THAI CHARACTER MAIYAMOK - u'\u0e47' # 0xE7 -> THAI CHARACTER MAITAIKHU - u'\u0e48' # 0xE8 -> THAI CHARACTER MAI EK - u'\u0e49' # 0xE9 -> THAI CHARACTER MAI THO - u'\u0e4a' # 0xEA -> THAI CHARACTER MAI TRI - u'\u0e4b' # 0xEB -> THAI CHARACTER MAI CHATTAWA - u'\u0e4c' # 0xEC -> THAI CHARACTER THANTHAKHAT - u'\u0e4d' # 0xED -> THAI CHARACTER NIKHAHIT - u'\u0e4e' # 0xEE -> THAI CHARACTER YAMAKKAN - u'\u0e4f' # 0xEF -> THAI CHARACTER FONGMAN - u'\u0e50' # 0xF0 -> THAI DIGIT ZERO - u'\u0e51' # 0xF1 -> THAI DIGIT ONE - u'\u0e52' # 0xF2 -> THAI DIGIT TWO - u'\u0e53' # 0xF3 -> THAI DIGIT THREE - u'\u0e54' # 0xF4 -> THAI DIGIT FOUR - u'\u0e55' # 0xF5 -> THAI DIGIT FIVE - u'\u0e56' # 0xF6 -> THAI DIGIT SIX - u'\u0e57' # 0xF7 -> THAI DIGIT SEVEN - u'\u0e58' # 0xF8 -> THAI DIGIT EIGHT - u'\u0e59' # 0xF9 -> THAI DIGIT NINE - u'\u0e5a' # 0xFA -> THAI CHARACTER ANGKHANKHU - u'\u0e5b' # 0xFB -> THAI CHARACTER KHOMUT - u'\ufffe' - u'\ufffe' - u'\ufffe' - u'\ufffe' -) - -### Encoding table -encoding_table=codecs.charmap_build(decoding_table) diff --git a/PythonEnv/2.7/Lib/encodings/tis_620.pyc b/PythonEnv/2.7/Lib/encodings/tis_620.pyc deleted file mode 100644 index e7ce3674744b7bed19c8945522535dffce8771ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2913 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 diff --git a/PythonEnv/2.7/Lib/encodings/unicode_internal.py b/PythonEnv/2.7/Lib/encodings/unicode_internal.py deleted file mode 100644 index df3e7752d..000000000 --- a/PythonEnv/2.7/Lib/encodings/unicode_internal.py +++ /dev/null @@ -1,45 +0,0 @@ -""" Python 'unicode-internal' Codec - - -Written by Marc-Andre Lemburg (mal@lemburg.com). - -(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. - -""" -import codecs - -### Codec APIs - -class Codec(codecs.Codec): - - # Note: Binding these as C functions will result in the class not - # converting them to methods. This is intended. - encode = codecs.unicode_internal_encode - decode = codecs.unicode_internal_decode - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return codecs.unicode_internal_encode(input, self.errors)[0] - -class IncrementalDecoder(codecs.IncrementalDecoder): - def decode(self, input, final=False): - return codecs.unicode_internal_decode(input, self.errors)[0] - -class StreamWriter(Codec,codecs.StreamWriter): - pass - -class StreamReader(Codec,codecs.StreamReader): - pass - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='unicode-internal', - encode=Codec.encode, - decode=Codec.decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamwriter=StreamWriter, - streamreader=StreamReader, - ) diff --git a/PythonEnv/2.7/Lib/encodings/unicode_internal.pyc b/PythonEnv/2.7/Lib/encodings/unicode_internal.pyc deleted file mode 100644 index aa1f95cbfe62b94bcfd78af63851beffca6d75ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2157 zcmc&#QEL-H5T46jF3Gi35k(^f4-t9=n+IQnBGMQY3O33{C=G$*dbdfhTrOpIqXc|w zpTu9`U-Sp)%v^IPwNL3oFWu?v&fU&8-^|Y1zc;*RKjsH9Ts}7b-@~DQp-2FRC@n~8 zkXbN9#Rh4?X${7xJ8%JT4sbNAK~iUf%?7tL*pM{X;IN@t8XQPkAZu)^!x%U4N?RS0 zwWZBv+j?npA=#kGutA^(!5zZ-6NUeIVNPbbzctU(c$UbWG&fS^QMTpxa2k7_cc@Zh zWbPj?{DVlvJKa1{(*G!@$8$CDgK3oQWyPcu&!*cQ&kN#h{Q7L6(#eVOdwsG0!tZ98 zFKDiPA+=OrWzzBcpZvqF5Z(TlBm6A=gHPYo5f=L{*|l)xEg^n_LShsa#d&JO&|#$x zLl?v#Kq~|d6sCzH4D)Cz!_asNydhjvi7PRla)QQ6O9C8shs zQTCppsgjr)nwgjfsFcKD{as+$*+dCZ7gKdEM-O#P0U3Z(3%=tYDm6IATC$)$2x!lK ziUI=qMzA121tUt$lxB;eMJ=;2XDrRn=7zO#ise(0u>ucN0S{?&!U9%6js!&_Xn~!4 zh%zk&y;yl#mG&m?LIkoq_dn9#aiVX5bShNQq7XR;RK{YB#5%3vSh>*XjI?oFPq3gG z6!cEzWL0jd(L7#yLT(BAz$h6_sjbM0)$)u}Hi}YSo@h#XmHwM!x{Ld5;#lUp!X#vr z+zzIDi05gADMpna!rH^3cTp5awzydEN-^966NeSN8R~R25|<7tULOWqeUm!jIWz_V zl~JEhEHy<7I{-?i4AcBAdIolSeQ{ug9ixmo}K diff --git a/PythonEnv/2.7/Lib/encodings/utf_16.py b/PythonEnv/2.7/Lib/encodings/utf_16.py deleted file mode 100644 index f3fadff61..000000000 --- a/PythonEnv/2.7/Lib/encodings/utf_16.py +++ /dev/null @@ -1,126 +0,0 @@ -""" Python 'utf-16' Codec - - -Written by Marc-Andre Lemburg (mal@lemburg.com). - -(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. - -""" -import codecs, sys - -### Codec APIs - -encode = codecs.utf_16_encode - -def decode(input, errors='strict'): - return codecs.utf_16_decode(input, errors, True) - -class IncrementalEncoder(codecs.IncrementalEncoder): - def __init__(self, errors='strict'): - codecs.IncrementalEncoder.__init__(self, errors) - self.encoder = None - - def encode(self, input, final=False): - if self.encoder is None: - result = codecs.utf_16_encode(input, self.errors)[0] - if sys.byteorder == 'little': - self.encoder = codecs.utf_16_le_encode - else: - self.encoder = codecs.utf_16_be_encode - return result - return self.encoder(input, self.errors)[0] - - def reset(self): - codecs.IncrementalEncoder.reset(self) - self.encoder = None - - def getstate(self): - # state info we return to the caller: - # 0: stream is in natural order for this platform - # 2: endianness hasn't been determined yet - # (we're never writing in unnatural order) - return (2 if self.encoder is None else 0) - - def setstate(self, state): - if state: - self.encoder = None - else: - if sys.byteorder == 'little': - self.encoder = codecs.utf_16_le_encode - else: - self.encoder = codecs.utf_16_be_encode - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - def __init__(self, errors='strict'): - codecs.BufferedIncrementalDecoder.__init__(self, errors) - self.decoder = None - - def _buffer_decode(self, input, errors, final): - if self.decoder is None: - (output, consumed, byteorder) = \ - codecs.utf_16_ex_decode(input, errors, 0, final) - if byteorder == -1: - self.decoder = codecs.utf_16_le_decode - elif byteorder == 1: - self.decoder = codecs.utf_16_be_decode - elif consumed >= 2: - raise UnicodeError("UTF-16 stream does not start with BOM") - return (output, consumed) - return self.decoder(input, self.errors, final) - - def reset(self): - codecs.BufferedIncrementalDecoder.reset(self) - self.decoder = None - -class StreamWriter(codecs.StreamWriter): - def __init__(self, stream, errors='strict'): - codecs.StreamWriter.__init__(self, stream, errors) - self.encoder = None - - def reset(self): - codecs.StreamWriter.reset(self) - self.encoder = None - - def encode(self, input, errors='strict'): - if self.encoder is None: - result = codecs.utf_16_encode(input, errors) - if sys.byteorder == 'little': - self.encoder = codecs.utf_16_le_encode - else: - self.encoder = codecs.utf_16_be_encode - return result - else: - return self.encoder(input, errors) - -class StreamReader(codecs.StreamReader): - - def reset(self): - codecs.StreamReader.reset(self) - try: - del self.decode - except AttributeError: - pass - - def decode(self, input, errors='strict'): - (object, consumed, byteorder) = \ - codecs.utf_16_ex_decode(input, errors, 0, False) - if byteorder == -1: - self.decode = codecs.utf_16_le_decode - elif byteorder == 1: - self.decode = codecs.utf_16_be_decode - elif consumed>=2: - raise UnicodeError,"UTF-16 stream does not start with BOM" - return (object, consumed) - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='utf-16', - encode=encode, - decode=decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) diff --git a/PythonEnv/2.7/Lib/encodings/utf_16.pyc b/PythonEnv/2.7/Lib/encodings/utf_16.pyc deleted file mode 100644 index d87dc8b580a0c12549a2e3ef14e87fdc49946541..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5108 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 AjQ{`u diff --git a/PythonEnv/2.7/Lib/encodings/utf_16_be.py b/PythonEnv/2.7/Lib/encodings/utf_16_be.py deleted file mode 100644 index 86b458eb9..000000000 --- a/PythonEnv/2.7/Lib/encodings/utf_16_be.py +++ /dev/null @@ -1,42 +0,0 @@ -""" Python 'utf-16-be' Codec - - -Written by Marc-Andre Lemburg (mal@lemburg.com). - -(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. - -""" -import codecs - -### Codec APIs - -encode = codecs.utf_16_be_encode - -def decode(input, errors='strict'): - return codecs.utf_16_be_decode(input, errors, True) - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return codecs.utf_16_be_encode(input, self.errors)[0] - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - _buffer_decode = codecs.utf_16_be_decode - -class StreamWriter(codecs.StreamWriter): - encode = codecs.utf_16_be_encode - -class StreamReader(codecs.StreamReader): - decode = codecs.utf_16_be_decode - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='utf-16-be', - encode=encode, - decode=decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) diff --git a/PythonEnv/2.7/Lib/encodings/utf_16_be.pyc b/PythonEnv/2.7/Lib/encodings/utf_16_be.pyc deleted file mode 100644 index 15906adbf84d0c4bb244a0248fbaa58202cf5b65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1974 zcmbtUZEF)j5T48B^_u#Q67j?72YUq@s7M77X&My@Hp;e88Un}Vc9UMYT*}@?3G`d* z7k`2O(;uKSbLk~iznEOQ)7_b!-DjV9v45>Q&wfk}LYRFv{@=xs{zM@Gx+pD>1&A%^ zTA(aAD?rx)VP4qsW>S%as+;&Iozi?Y|>%^h6hgZ%9szps2$q1w<{M|z?>I@pv@M9KNYu%FU;tWytlz#@H)v-X=_ z#?H&vy*TRkRD$P3$uRBZXE)EM?4Mn68=X=*9V~MX<$e-sHByNQ;t%AjbVx?}XxAQ& z^Z^Qmfx*-$P`*$`*dVf(h4irN(WdQ>P|SE>DlnNY(a(a$A-}5=;Rawr1aWhN3VwnT z^!SW4A|+MvK+uFq8AM4CFV94F1BGkGgvTdWQQ`YZFjBs69A1pZauU;$(0mNyREag5 z&9DC7NQer$6YqR;`L7tf=RBClfcW7U+{H;AgEN~-5(9ur@CcizlUOG~E`nlbsDk|d zWH3;AmS8IYr^I=P;~F?!cxbc=MpT0fX|pWkDjv8hyTnrCpCE+_7IS-9ki@H?Ca?mN z6#gf3ka@ik!(2eGaFP{J)|RmkV=s|KFxZewfL#JRFs3B7UaV|c1yjLpTsib==-A;V zLRp;BGVhs8EkozJkLGosm4m*i&iaKm6liRD7-$^G;ez5DN8aPe5u=7~Y*T;RPX^=p zjhyv@-Y4ksg2J>sfrd(Os1VW+`<9+Q#brwE6s($6Uif*m5xJqVmgCU(v)afLjoDyq x<}q&C<4RF-p(W1BF@sL1GyIfdE8r&pZ?o3&j^+%$Y}JdkLfvi@8#ew*e*kBDh`0a% diff --git a/PythonEnv/2.7/Lib/encodings/utf_16_le.py b/PythonEnv/2.7/Lib/encodings/utf_16_le.py deleted file mode 100644 index ec454142e..000000000 --- a/PythonEnv/2.7/Lib/encodings/utf_16_le.py +++ /dev/null @@ -1,42 +0,0 @@ -""" Python 'utf-16-le' Codec - - -Written by Marc-Andre Lemburg (mal@lemburg.com). - -(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. - -""" -import codecs - -### Codec APIs - -encode = codecs.utf_16_le_encode - -def decode(input, errors='strict'): - return codecs.utf_16_le_decode(input, errors, True) - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return codecs.utf_16_le_encode(input, self.errors)[0] - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - _buffer_decode = codecs.utf_16_le_decode - -class StreamWriter(codecs.StreamWriter): - encode = codecs.utf_16_le_encode - -class StreamReader(codecs.StreamReader): - decode = codecs.utf_16_le_decode - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='utf-16-le', - encode=encode, - decode=decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) diff --git a/PythonEnv/2.7/Lib/encodings/utf_16_le.pyc b/PythonEnv/2.7/Lib/encodings/utf_16_le.pyc deleted file mode 100644 index 9ebec057fd047f219fd55bc4516835fb15d6cbd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1974 zcmbtUZEF)j5T48B^_u#Q67j?72YUq@s7M77X&My@Hp;e88Un}Vc9UMYT*}@?3G`d* z7k`2O(;uKSbLk~iznEOQ)7_b!-DjV9v45>Q&wfk}LYRFv{@=xs{zM@Gx+pD>1&A%^ zTA(aAD?rxIRZo4D)U%0I}b_K0dSEy9! zuSz!E&S&?yB}A)pbb@ZtZ~Qu@OrVU8LK7BnN~4IQP3rq748WNM7XTL)m;zkd_z(;A z9gj$7_mH5c<_@m$LH_oRA1fbKs5W%gk)9}z4mKqeQF1;p?5DII>(oOXut=Zdto^2! zvGekEFOK>>mEbv1GE95<+0FAQ`)60&MyHfc2g}?;xu1kujZ|WS_yhSW9g>kg+O>xx zeSkt?U@$cblrNMKHi+zHAwBGRv}yYz6f+)}3QVR;^s}IG$nWYzxB-|DLEPM+f}fxS zJw79iNJ&*Z5Hw*@22m2k%QKPPK;fD(;ql2;RQP@pjFj&ihZm!0fa7vtqIIe-yg@;C~U_>>zkT%OguHu2KvP&#A{s~g3U@^Cs1xdULY62@T zN#TDo2btF!G0X+@3MW|sWo;SzF!mBz1cME^1lT3817k{J>&42JRWKFo#+5^_hK?O> zB9z4`E%Tnq)G~Cg`)FSGSvlyN>a1UALxIMYhk?d{94;unapXOY95HI>#y0i0{bVqn z-^f`n=zW47FDOjQ6KJRehYBGLv2W?=Q(UIhPQj{K<%OR|8<86-YdH>mKdX&A(U=X! xW*+0FJ+2fb7h2-195d*II>S#XwgP?v@HT5L?`Y28%T~QuE7a{qv0>w{^amaPi7)^F diff --git a/PythonEnv/2.7/Lib/encodings/utf_32.py b/PythonEnv/2.7/Lib/encodings/utf_32.py deleted file mode 100644 index 6c8016fe1..000000000 --- a/PythonEnv/2.7/Lib/encodings/utf_32.py +++ /dev/null @@ -1,150 +0,0 @@ -""" -Python 'utf-32' Codec -""" -import codecs, sys - -### Codec APIs - -encode = codecs.utf_32_encode - -def decode(input, errors='strict'): - return codecs.utf_32_decode(input, errors, True) - -class IncrementalEncoder(codecs.IncrementalEncoder): - def __init__(self, errors='strict'): - codecs.IncrementalEncoder.__init__(self, errors) - self.encoder = None - - def encode(self, input, final=False): - if self.encoder is None: - result = codecs.utf_32_encode(input, self.errors)[0] - if sys.byteorder == 'little': - self.encoder = codecs.utf_32_le_encode - else: - self.encoder = codecs.utf_32_be_encode - return result - return self.encoder(input, self.errors)[0] - - def reset(self): - codecs.IncrementalEncoder.reset(self) - self.encoder = None - - def getstate(self): - # state info we return to the caller: - # 0: stream is in natural order for this platform - # 2: endianness hasn't been determined yet - # (we're never writing in unnatural order) - return (2 if self.encoder is None else 0) - - def setstate(self, state): - if state: - self.encoder = None - else: - if sys.byteorder == 'little': - self.encoder = codecs.utf_32_le_encode - else: - self.encoder = codecs.utf_32_be_encode - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - def __init__(self, errors='strict'): - codecs.BufferedIncrementalDecoder.__init__(self, errors) - self.decoder = None - - def _buffer_decode(self, input, errors, final): - if self.decoder is None: - (output, consumed, byteorder) = \ - codecs.utf_32_ex_decode(input, errors, 0, final) - if byteorder == -1: - self.decoder = codecs.utf_32_le_decode - elif byteorder == 1: - self.decoder = codecs.utf_32_be_decode - elif consumed >= 4: - raise UnicodeError("UTF-32 stream does not start with BOM") - return (output, consumed) - return self.decoder(input, self.errors, final) - - def reset(self): - codecs.BufferedIncrementalDecoder.reset(self) - self.decoder = None - - def getstate(self): - # additonal state info from the base class must be None here, - # as it isn't passed along to the caller - state = codecs.BufferedIncrementalDecoder.getstate(self)[0] - # additional state info we pass to the caller: - # 0: stream is in natural order for this platform - # 1: stream is in unnatural order - # 2: endianness hasn't been determined yet - if self.decoder is None: - return (state, 2) - addstate = int((sys.byteorder == "big") != - (self.decoder is codecs.utf_32_be_decode)) - return (state, addstate) - - def setstate(self, state): - # state[1] will be ignored by BufferedIncrementalDecoder.setstate() - codecs.BufferedIncrementalDecoder.setstate(self, state) - state = state[1] - if state == 0: - self.decoder = (codecs.utf_32_be_decode - if sys.byteorder == "big" - else codecs.utf_32_le_decode) - elif state == 1: - self.decoder = (codecs.utf_32_le_decode - if sys.byteorder == "big" - else codecs.utf_32_be_decode) - else: - self.decoder = None - -class StreamWriter(codecs.StreamWriter): - def __init__(self, stream, errors='strict'): - self.encoder = None - codecs.StreamWriter.__init__(self, stream, errors) - - def reset(self): - codecs.StreamWriter.reset(self) - self.encoder = None - - def encode(self, input, errors='strict'): - if self.encoder is None: - result = codecs.utf_32_encode(input, errors) - if sys.byteorder == 'little': - self.encoder = codecs.utf_32_le_encode - else: - self.encoder = codecs.utf_32_be_encode - return result - else: - return self.encoder(input, errors) - -class StreamReader(codecs.StreamReader): - - def reset(self): - codecs.StreamReader.reset(self) - try: - del self.decode - except AttributeError: - pass - - def decode(self, input, errors='strict'): - (object, consumed, byteorder) = \ - codecs.utf_32_ex_decode(input, errors, 0, False) - if byteorder == -1: - self.decode = codecs.utf_32_le_decode - elif byteorder == 1: - self.decode = codecs.utf_32_be_decode - elif consumed>=4: - raise UnicodeError,"UTF-32 stream does not start with BOM" - return (object, consumed) - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='utf-32', - encode=encode, - decode=decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) diff --git a/PythonEnv/2.7/Lib/encodings/utf_32.pyc b/PythonEnv/2.7/Lib/encodings/utf_32.pyc deleted file mode 100644 index a48e5292a5d8c5b7ac1aa087f54f7091c03b894d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5666 zcmcIoe{UPd5uH08Ns*>v$97$*aa+1>YbHh7)Na$FHQK~#3^4HQ5Oys!0^c3rwg>RM-B7j4`tzFGNm6 zzSwC<)YO5d4y=^}YZA3|prr%ta-b#AB^_w%K&KpNOSI01ol6vJyZ0KU{VuBZr$_GT zH0|D*x$)cg?%wHcO`~|!PX3Eu-!(YRWy#2md^A}Clr45&L*+#FJ$Wwj+!N=^Nex?j z=xh zc1_s3zuBE6d%JOpeUkJ^zH1x*{Hr5fZ2PydBInlPxvQu@Oh;LK7^iMH`G5=KY{WtS zIO_pQ{(Dq0lmsiN1!*0a43_fMQff775hjD}(13~R+Gt9+-J`lf6e+buHEf~eT~wy6 zeZNrHi7y`B1MLm4v6QN#Dne>8Y;w^Ws=**h6E_&B()!ahb{tX##F;5DKt~==#vzxV zUvnW}qp09U;$8Dbl${Ud84mFPY4;W52Wyi3nMMbkVSV-of+GR!o5wX8bRWv`<-nKh zq0VdSQAN^@KCTsy&jA|Sb#S1zHy8vxz&ut_|V}LLxJ# z+Qqxy@G6W@F-w`<4etkX)yyCG@JYvPp*s4cQth5`_nBiqs>cWIt_&O>( zE1{$)QaR6W06iwmsmt$Rvz#Usui$;yP8bXhr_l^pAE=+J1P_Ok zJPxm8RIM7`U~2`Uqe(Sn0( z+5lA=^=jDUP~-nVz3zJu=D}<{j3jokfdJT{E@Na8CQ8BFV0gTnNdP0E5w~U%34I~qS@NHt`s~p| zOWf1$gHJwID2G45^aYwkC^?s8+4*n&kkU^kc3J z10`NPxpGy|3%)k~Xwqv8gHPeO+Qv>|}X~D`pl; z%+av~cLs}tP(MQ(4cRw`MN7h;qFU7}!^Daf!!G+uU02~Qq*BlCEgFg*VQEfR6#p8u z*zq^$A*_9iyPFsa$<@ZlB$rnd&2D0=cTmb`)>=n2d(F|R+e%!Iv&5Zti+B?=V#KB8 zTSOJdkUk@n;c5{ua8cbMifF#QGhQ)p{jNrJ^#utj=&@rg~Zl38tFsmjAanGD2nX3#TC` zeXMlRSv(X2o)_DEC!{?8^nX`Q1!iYS=zD3G@#jAnR*1gL4`O@-8 zoM}fgZwCVTg~bxPd2YuP&92z@buzBvNHGFQ?`igCiQQuzGQP*q2D3Nh&`j*6MPm1j zuUQ?I2O5xHN&cp3mFo3}I7|2jt1c^^GrYy>N2u(p$ui6>^V-{wM=ty^C-Op7LGjEe z zg*6b}kzfO*`2L4<2p|5SgJ?}~zc`WRwg%unhQT_x)~Q$77dyMbQEa_vCDmuH;`7jI zcX3%!Z?rgoESz6O7}>1jnMO8Cz-d7Je6qz4c^{_ZY4t|E@`X1sBUIO+)4!zh907p) zdlo;zH@fWTA9ysYc`e*-tG^z_)LYkJ5KTw8(JI9B+O14_9peTu1)%1EDxyXhm6KL@ hSvl9R_P*Vw|3ETQAsgOC(DFOA&D)#zHm`5q_#X|t!Gr(+ diff --git a/PythonEnv/2.7/Lib/encodings/utf_32_be.py b/PythonEnv/2.7/Lib/encodings/utf_32_be.py deleted file mode 100644 index fe272b5fa..000000000 --- a/PythonEnv/2.7/Lib/encodings/utf_32_be.py +++ /dev/null @@ -1,37 +0,0 @@ -""" -Python 'utf-32-be' Codec -""" -import codecs - -### Codec APIs - -encode = codecs.utf_32_be_encode - -def decode(input, errors='strict'): - return codecs.utf_32_be_decode(input, errors, True) - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return codecs.utf_32_be_encode(input, self.errors)[0] - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - _buffer_decode = codecs.utf_32_be_decode - -class StreamWriter(codecs.StreamWriter): - encode = codecs.utf_32_be_encode - -class StreamReader(codecs.StreamReader): - decode = codecs.utf_32_be_decode - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='utf-32-be', - encode=encode, - decode=decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) diff --git a/PythonEnv/2.7/Lib/encodings/utf_32_be.pyc b/PythonEnv/2.7/Lib/encodings/utf_32_be.pyc deleted file mode 100644 index 082d83dc013b8e9dc8b343c979a61db0ace0e9e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1867 zcmbtUO>5gg5FJ_mj?-@_E4HJnBVI7Gok~lJS z#5i(Vk)bOQ{;G0?$*M#(ov+ChE9-J4aw+nCSd*xsj=DOUrK2HHOC3#hv`a@*q8)X# z)X^y&Es1tH7`6#z;N2m@Cot_V=k~`u-P>Q->5IdI7ZbC;*PBNsY{!4`^=+LiZ5D?% ztf0$QMeA|;A&eC{b>u?i!Vz1MOBc}{%=bMqq1!{o%k4dkaY}G_5KK&fDNI|&`kF0_ z$H2A*6Q^ejtNTor&9mIYoT$m4qt|;gDj*-c9wqT)WKzV5)02Eu#(sHruKSB4+Srsc zx;XX$>~R`qW@b`5PCjz4$wE5$an%u8{s_i^E##}hBr;8|_{GgaUhKN{xco89k_V*% z8NS3mN4f*OS3kxAQ9^ujbAt-Kg7JCzf;5tnn`G*as5`anZh|TZNFtAeU^In!W3?_@|)MU#CwgvFJ2u2Xszw?X=5y#BT~1xa3gioh03vg}wROOR!~kzp;MSLhT4RA?o{5n2*e#X==( z0+oO);z>deQQ1*bYy%S67FYhx=n-geRf+q%$PM}-a`BMyY%BeUl zr@r>{xDed1lB0PT1VwF>4^7!nY?k7Gq?KZ#HA!5SV*#D03;bR5w!lvSZwqO8N99!T Rb*EEpRXT3B+I8`({R8~1W!C@z diff --git a/PythonEnv/2.7/Lib/encodings/utf_32_le.py b/PythonEnv/2.7/Lib/encodings/utf_32_le.py deleted file mode 100644 index 9e4821092..000000000 --- a/PythonEnv/2.7/Lib/encodings/utf_32_le.py +++ /dev/null @@ -1,37 +0,0 @@ -""" -Python 'utf-32-le' Codec -""" -import codecs - -### Codec APIs - -encode = codecs.utf_32_le_encode - -def decode(input, errors='strict'): - return codecs.utf_32_le_decode(input, errors, True) - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return codecs.utf_32_le_encode(input, self.errors)[0] - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - _buffer_decode = codecs.utf_32_le_decode - -class StreamWriter(codecs.StreamWriter): - encode = codecs.utf_32_le_encode - -class StreamReader(codecs.StreamReader): - decode = codecs.utf_32_le_decode - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='utf-32-le', - encode=encode, - decode=decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) diff --git a/PythonEnv/2.7/Lib/encodings/utf_32_le.pyc b/PythonEnv/2.7/Lib/encodings/utf_32_le.pyc deleted file mode 100644 index a4e1ec3b248433dd95d2ea34104a30b2403a21b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1867 zcmbtUO>5gg5FJ_mj?-@_Ep5&u4_N(&?U0-a`#-g0j z#j%fIkJ2zRQ+@|Bom(e@webuZvDTR@EcgZjix!M-^sy8y$8!2kRQ##Lv+d< zoVlzMBmjfrktx4J!@x?Z&vRLxFgTu1CMH{4unmCUM=*l80nQBvHZ$Yt_bj$6*JfSF zO$6MOT>|87y$jMeal#DP&5mLf5*Fmvvv1Lw0+((2LA6(U3eO z8Vww-4E)s0dzv||WbW9bz8$5L*>Xp{^*+z%^YA{?v_65BC3s>0=>)o!T|CEUPB|5) z<<5lK~U62dC`;&#bzn~hgvBnT9L#>ITp}~y1?H>Zv*@U@UD=S_f$>= RUw1myR;A;1t6djw?H{iLW={YB diff --git a/PythonEnv/2.7/Lib/encodings/utf_7.py b/PythonEnv/2.7/Lib/encodings/utf_7.py deleted file mode 100644 index 8e0567f20..000000000 --- a/PythonEnv/2.7/Lib/encodings/utf_7.py +++ /dev/null @@ -1,38 +0,0 @@ -""" Python 'utf-7' Codec - -Written by Brian Quinlan (brian@sweetapp.com). -""" -import codecs - -### Codec APIs - -encode = codecs.utf_7_encode - -def decode(input, errors='strict'): - return codecs.utf_7_decode(input, errors, True) - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return codecs.utf_7_encode(input, self.errors)[0] - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - _buffer_decode = codecs.utf_7_decode - -class StreamWriter(codecs.StreamWriter): - encode = codecs.utf_7_encode - -class StreamReader(codecs.StreamReader): - decode = codecs.utf_7_decode - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='utf-7', - encode=encode, - decode=decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) diff --git a/PythonEnv/2.7/Lib/encodings/utf_7.pyc b/PythonEnv/2.7/Lib/encodings/utf_7.pyc deleted file mode 100644 index 57b8bdf916a89421e9895d8025a03d292d523966..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1867 zcmbtUU279T6uq0xcT>MbD+s}tt`GJ>go22aMhkr~=tdAjU`ci-b<1WGb|;iT-`XdC zf&bGVpy%9;Nl;&mN#4W$&fkTy{J8i(!pOftL?V4iN1~D>j`STd zj+~dI?@EMUS+1chOH@&PMaI}!m1~hJkc-e0N`y~NHYiZ&#^<98 zqDV$=lCjT;k};0cVX_?qh4-6uSuo(K*E$qIkPas%2y9aqlW8bvXPVR>{u&zXJ5la5Im$1xP-97W$S9lD&s( zfUCM9vsx%GFewV9=$mMi=oL{}EIMXI&v;_v>}sQ6*5*tG zZE8xVLe|=j*R@@we)hY%=n0ty7wrte#Q=93iVKalr_mylmX~+fyH3;bbbX^{xzD%x ze7Mi>Y)71Bsht_XIYVE{7LT#aZ$XIDaH<<$j~l@W%Qu>aK~U7eDzTIa#bqC1)3H{C ri8fl^vh)hrL|kCs!)#0Jy!=(sK3;3{BJiryDmO|kcdxwX;#>I%@GNJH diff --git a/PythonEnv/2.7/Lib/encodings/utf_8.py b/PythonEnv/2.7/Lib/encodings/utf_8.py deleted file mode 100644 index 1bf633657..000000000 --- a/PythonEnv/2.7/Lib/encodings/utf_8.py +++ /dev/null @@ -1,42 +0,0 @@ -""" Python 'utf-8' Codec - - -Written by Marc-Andre Lemburg (mal@lemburg.com). - -(c) Copyright CNRI, All Rights Reserved. NO WARRANTY. - -""" -import codecs - -### Codec APIs - -encode = codecs.utf_8_encode - -def decode(input, errors='strict'): - return codecs.utf_8_decode(input, errors, True) - -class IncrementalEncoder(codecs.IncrementalEncoder): - def encode(self, input, final=False): - return codecs.utf_8_encode(input, self.errors)[0] - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - _buffer_decode = codecs.utf_8_decode - -class StreamWriter(codecs.StreamWriter): - encode = codecs.utf_8_encode - -class StreamReader(codecs.StreamReader): - decode = codecs.utf_8_decode - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='utf-8', - encode=encode, - decode=decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) diff --git a/PythonEnv/2.7/Lib/encodings/utf_8.pyc b/PythonEnv/2.7/Lib/encodings/utf_8.pyc deleted file mode 100644 index 8faa25067bba2b1e52e9e9e6cbad936814b33b6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1926 zcmbtU-)j>=5T48LTvLCeRD3x5(ks|Lh+q+swo##AqihPLp>QO3oAk=%Qua1VpfA!s z`4{+q`UmJYb7>OP7vrTn-JRLl{pQ=5DgIb>*T0PqLz;d?{NKgMzC%Pr9Y}|w0woT0 z9MTS*7pPOD2!AEIhO$IaS@dPTWL!F{kUUXcB()MpL!mkkCr-?lqrQXKa_P2I6yyhsz2iNl_F6|LaEpK9YuO3|vL+5~SiqD=38TsC`w*7s+@VXNONVTMu8Ii4fxhK4 z;o=@L^vpJ}MliunfF)Fx&p9$?m#0bG zJJl)9iPJ%LD(7xrOvE=o{x%#kKA9YQ5Aq-ljUMXMc9VDPr%lL4{&?3uM)m+g<1vs9 z1 zPLzijH=y~lwl%stw*5LBThb^vYcoy;>4!q6 zK$hB$=e3=uzWH69_XHyqh<1j@#Q=8;iZAlozPuJQY5DRd_pXDqKbqetS*|!X#epk+ zp5=(MTxtUiI0N)0GkJ<-b_ar-x>H&B`MeRFaQQ}~FbMKGm?f4lA-L>gY}%Kq(9uH6 no0eVQ=+s7N83-F55DAfy%;#z5~h+p{^@z{9q diff --git a/PythonEnv/2.7/Lib/encodings/utf_8_sig.py b/PythonEnv/2.7/Lib/encodings/utf_8_sig.py deleted file mode 100644 index 8784694f0..000000000 --- a/PythonEnv/2.7/Lib/encodings/utf_8_sig.py +++ /dev/null @@ -1,117 +0,0 @@ -""" Python 'utf-8-sig' Codec -This work similar to UTF-8 with the following changes: - -* On encoding/writing a UTF-8 encoded BOM will be prepended/written as the - first three bytes. - -* On decoding/reading if the first three bytes are a UTF-8 encoded BOM, these - bytes will be skipped. -""" -import codecs - -### Codec APIs - -def encode(input, errors='strict'): - return (codecs.BOM_UTF8 + codecs.utf_8_encode(input, errors)[0], len(input)) - -def decode(input, errors='strict'): - prefix = 0 - if input[:3] == codecs.BOM_UTF8: - input = input[3:] - prefix = 3 - (output, consumed) = codecs.utf_8_decode(input, errors, True) - return (output, consumed+prefix) - -class IncrementalEncoder(codecs.IncrementalEncoder): - def __init__(self, errors='strict'): - codecs.IncrementalEncoder.__init__(self, errors) - self.first = 1 - - def encode(self, input, final=False): - if self.first: - self.first = 0 - return codecs.BOM_UTF8 + codecs.utf_8_encode(input, self.errors)[0] - else: - return codecs.utf_8_encode(input, self.errors)[0] - - def reset(self): - codecs.IncrementalEncoder.reset(self) - self.first = 1 - - def getstate(self): - return self.first - - def setstate(self, state): - self.first = state - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - def __init__(self, errors='strict'): - codecs.BufferedIncrementalDecoder.__init__(self, errors) - self.first = True - - def _buffer_decode(self, input, errors, final): - if self.first: - if len(input) < 3: - if codecs.BOM_UTF8.startswith(input): - # not enough data to decide if this really is a BOM - # => try again on the next call - return (u"", 0) - else: - self.first = None - else: - self.first = None - if input[:3] == codecs.BOM_UTF8: - (output, consumed) = codecs.utf_8_decode(input[3:], errors, final) - return (output, consumed+3) - return codecs.utf_8_decode(input, errors, final) - - def reset(self): - codecs.BufferedIncrementalDecoder.reset(self) - self.first = True - -class StreamWriter(codecs.StreamWriter): - def reset(self): - codecs.StreamWriter.reset(self) - try: - del self.encode - except AttributeError: - pass - - def encode(self, input, errors='strict'): - self.encode = codecs.utf_8_encode - return encode(input, errors) - -class StreamReader(codecs.StreamReader): - def reset(self): - codecs.StreamReader.reset(self) - try: - del self.decode - except AttributeError: - pass - - def decode(self, input, errors='strict'): - if len(input) < 3: - if codecs.BOM_UTF8.startswith(input): - # not enough data to decide if this is a BOM - # => try again on the next call - return (u"", 0) - elif input[:3] == codecs.BOM_UTF8: - self.decode = codecs.utf_8_decode - (output, consumed) = codecs.utf_8_decode(input[3:],errors) - return (output, consumed+3) - # (else) no BOM present - self.decode = codecs.utf_8_decode - return codecs.utf_8_decode(input, errors) - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='utf-8-sig', - encode=encode, - decode=decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) diff --git a/PythonEnv/2.7/Lib/encodings/utf_8_sig.pyc b/PythonEnv/2.7/Lib/encodings/utf_8_sig.pyc deleted file mode 100644 index a060efd083c72d8deaa36412f7dc882a6f95b469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4925 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 diff --git a/PythonEnv/2.7/Lib/encodings/zlib_codec.py b/PythonEnv/2.7/Lib/encodings/zlib_codec.py deleted file mode 100644 index 3419f9f48..000000000 --- a/PythonEnv/2.7/Lib/encodings/zlib_codec.py +++ /dev/null @@ -1,102 +0,0 @@ -""" Python 'zlib_codec' Codec - zlib compression encoding - - Unlike most of the other codecs which target Unicode, this codec - will return Python string objects for both encode and decode. - - Written by Marc-Andre Lemburg (mal@lemburg.com). - -""" -import codecs -import zlib # this codec needs the optional zlib module ! - -### Codec APIs - -def zlib_encode(input,errors='strict'): - - """ Encodes the object input and returns a tuple (output - object, length consumed). - - errors defines the error handling to apply. It defaults to - 'strict' handling which is the only currently supported - error handling for this codec. - - """ - assert errors == 'strict' - output = zlib.compress(input) - return (output, len(input)) - -def zlib_decode(input,errors='strict'): - - """ Decodes the object input and returns a tuple (output - object, length consumed). - - input must be an object which provides the bf_getreadbuf - buffer slot. Python strings, buffer objects and memory - mapped files are examples of objects providing this slot. - - errors defines the error handling to apply. It defaults to - 'strict' handling which is the only currently supported - error handling for this codec. - - """ - assert errors == 'strict' - output = zlib.decompress(input) - return (output, len(input)) - -class Codec(codecs.Codec): - - def encode(self, input, errors='strict'): - return zlib_encode(input, errors) - def decode(self, input, errors='strict'): - return zlib_decode(input, errors) - -class IncrementalEncoder(codecs.IncrementalEncoder): - def __init__(self, errors='strict'): - assert errors == 'strict' - self.errors = errors - self.compressobj = zlib.compressobj() - - def encode(self, input, final=False): - if final: - c = self.compressobj.compress(input) - return c + self.compressobj.flush() - else: - return self.compressobj.compress(input) - - def reset(self): - self.compressobj = zlib.compressobj() - -class IncrementalDecoder(codecs.IncrementalDecoder): - def __init__(self, errors='strict'): - assert errors == 'strict' - self.errors = errors - self.decompressobj = zlib.decompressobj() - - def decode(self, input, final=False): - if final: - c = self.decompressobj.decompress(input) - return c + self.decompressobj.flush() - else: - return self.decompressobj.decompress(input) - - def reset(self): - self.decompressobj = zlib.decompressobj() - -class StreamWriter(Codec,codecs.StreamWriter): - pass - -class StreamReader(Codec,codecs.StreamReader): - pass - -### encodings module API - -def getregentry(): - return codecs.CodecInfo( - name='zlib', - encode=zlib_encode, - decode=zlib_decode, - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamreader=StreamReader, - streamwriter=StreamWriter, - ) diff --git a/PythonEnv/2.7/Lib/encodings/zlib_codec.pyc b/PythonEnv/2.7/Lib/encodings/zlib_codec.pyc deleted file mode 100644 index d0ff2c53aca53dc5873da1dfeb6af4459b2f71fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4563 zcmdT{S#KOg5boLa9^Pzh#~i`nhZaKeMoKJ*I3zA5aS|zlSZJ&Wu#8r-GrjgWbF8L& z35&uD$rC?}7k&;Bukd}`H?C!1U?y0WhtE%q$pBFn%e;ePA)%2<3_Xe8% z9bKZ-KKeieE*^W3NXxwjIE(cW5eOy;VdLoff096Y;&iR!7>6N14&Ra_lfC2BBrW>Q{AUibE(K zmxUeYCZXt@=3}a=tSk&MOpEC@GNg}SpN#f%rH)3UY_hHIIj)Pw8La8bIg2f?`_|$U z?=kpCd|6}@9gnNZ6b_Ufk49zXOfvue#D4VC!nspXLl{K$me9EsbT_Rvl>?OSP<+R6 zg3Pr+%zy@qDh17Z{B;dz|GnYXnPSI5+Cv)GTjp< zIO@DBeaM*gF-m={$%YGcUrsZq~Xrw+`Z75mzQhQjRiTWUA*K ze+BEFcf7%o#5*2GlDeD+8VU#?dr8!i_-J)DK>)XZz6=r&&>i)#rjF}8%q^{rp7;Joe1na@FhYvNJ>+}U) zfamH8r9Q?#vWAx`V8OOHaZnFq1>ffOpa`GxQy4umO`Dz-64;!AEAkxn?bkHZJi8_+fs2~ ztj;%)2}F0*?b-HCVz-{8cXoIvy4sl3m$`W4zaMFNFA zYb1n3G;`j61VQ)~*HCy_y-@!2_}>7NJKT-2HpM@~c#r40ocAHKKt9uh#Ah3XFAB){ zpq0g2FLPE=we zT*2Tmp2l%6qS5@oBXMDm9+S%s?~<`~++B`(_ljXD2e6RG9m$6wK@n2(kj^-RGo?h! z9pMnCjB4@&*jeUsg>u?_=C8*C3M|88P*TP?_Ph()8-=2K;kf7-2`QWx^F2^!5tCbd f?oV7_lD14Xh=!oM)LrSWZ?rbnHr6)ln~i?}G&jLv diff --git a/PythonEnv/2.7/Lib/fnmatch.py b/PythonEnv/2.7/Lib/fnmatch.py deleted file mode 100644 index ffe99b576..000000000 --- a/PythonEnv/2.7/Lib/fnmatch.py +++ /dev/null @@ -1,116 +0,0 @@ -"""Filename matching with shell patterns. - -fnmatch(FILENAME, PATTERN) matches according to the local convention. -fnmatchcase(FILENAME, PATTERN) always takes case in account. - -The functions operate by translating the pattern into a regular -expression. They cache the compiled regular expressions for speed. - -The function translate(PATTERN) returns a regular expression -corresponding to PATTERN. (It does not compile it.) -""" - -import re - -__all__ = ["filter", "fnmatch", "fnmatchcase", "translate"] - -_cache = {} -_MAXCACHE = 100 - -def _purge(): - """Clear the pattern cache""" - _cache.clear() - -def fnmatch(name, pat): - """Test whether FILENAME matches PATTERN. - - Patterns are Unix shell style: - - * matches everything - ? matches any single character - [seq] matches any character in seq - [!seq] matches any char not in seq - - An initial period in FILENAME is not special. - Both FILENAME and PATTERN are first case-normalized - if the operating system requires it. - If you don't want this, use fnmatchcase(FILENAME, PATTERN). - """ - - import os - name = os.path.normcase(name) - pat = os.path.normcase(pat) - return fnmatchcase(name, pat) - -def filter(names, pat): - """Return the subset of the list NAMES that match PAT""" - import os,posixpath - result=[] - pat=os.path.normcase(pat) - if not pat in _cache: - res = translate(pat) - if len(_cache) >= _MAXCACHE: - _cache.clear() - _cache[pat] = re.compile(res) - match=_cache[pat].match - if os.path is posixpath: - # normcase on posix is NOP. Optimize it away from the loop. - for name in names: - if match(name): - result.append(name) - else: - for name in names: - if match(os.path.normcase(name)): - result.append(name) - return result - -def fnmatchcase(name, pat): - """Test whether FILENAME matches PATTERN, including case. - - This is a version of fnmatch() which doesn't case-normalize - its arguments. - """ - - if not pat in _cache: - res = translate(pat) - if len(_cache) >= _MAXCACHE: - _cache.clear() - _cache[pat] = re.compile(res) - return _cache[pat].match(name) is not None - -def translate(pat): - """Translate a shell PATTERN to a regular expression. - - There is no way to quote meta-characters. - """ - - i, n = 0, len(pat) - res = '' - while i < n: - c = pat[i] - i = i+1 - if c == '*': - res = res + '.*' - elif c == '?': - res = res + '.' - elif c == '[': - j = i - if j < n and pat[j] == '!': - j = j+1 - if j < n and pat[j] == ']': - j = j+1 - while j < n and pat[j] != ']': - j = j+1 - if j >= n: - res = res + '\\[' - else: - stuff = pat[i:j].replace('\\','\\\\') - i = j+1 - if stuff[0] == '!': - stuff = '^' + stuff[1:] - elif stuff[0] == '^': - stuff = '\\' + stuff - res = '%s[%s]' % (res, stuff) - else: - res = res + re.escape(c) - return res + '\Z(?ms)' diff --git a/PythonEnv/2.7/Lib/fnmatch.pyc b/PythonEnv/2.7/Lib/fnmatch.pyc deleted file mode 100644 index a375f6d4d64103c3362e337607ed430fc1c4d628..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3756 zcmcIn-EJF26h6C7oY>7@f73`sOeqOwU#wBb?&84OO)2F54pIl7pwNux?( zT^bVi=7wddQQ8zmj}G_qY~x;l%ljcB6 z;2ZsKn*8{w-#5zoyHLkMDoR9co>-h=9Xi{260k0#(w@$ItJQX2+00K&>|5CzLgl%! z8Yl5praO7;XLWth%d|0k5~ZN5k39m2^I3y*uLo0v17US6Y*ahVl<8?5zIKS=#=0@I zMy72JlO1n6qNxr8;RL-j8JMYDhVwM;TNS3bcaqw{X;fsJSL)H<_^jG0o~#|kcn~|m z&Ei4qiQ_g~%+}B!*h5D^5)Cni=cYR-W`<>mb{u*}PaCMFqJQH-=I z5^{(w8L;CJ4p_K>1|3)CF1q2(RtGrBw_A^*WGQZEIviw5D>D~`5X<-MA{ez93E&pP@HR2n`axdH#Fltpgy5jv%>5FNR6=<>~W&>(u|&=HM{ z;Kmqn$X0mv5MA~LR%d>NdDgYD>Slp9iILC_mHcVGmKF+8Sakfg?P8!+zLNi_Ietia<*d2^X(_5&P5&|}Yf3sCmh z_0FRhJ_yZCIj8UyDDwaxQ=nXh+$fZXA>gP&9e{gGpbUHiz5^(ufqU#uP+pTI;l+NsmwxJW>+L$`QTS_?ZT=%`xmby%U@Ny>hsgEsrj z-OWpMG(m@$p5V3F3p#|}sj}Q24x8Zj&bs!!il}qLh+8Sgp)3pp3`7EW3MC zJi+V@u;;Orz0mYdvP2zK1Er|m7BJLgbl-D&jZQJ;6t z6i{SKa1khmXfU)$ptVBQ89>Wrn_!%w1#AFXHzb+>Y=|ZdqH)?0^st0z5ok$kVF%ce zwZQgnZ4i0B$8P_Ne6ND1f;gA>$lYgt7)QzSmap?2%N?E+jw9m zF?lG47fl>LZNOZ^Xl2NW#4iP_@KcE8T?9bHNhE@xm4j~_JTqeEE&%$YQ$)oDW*W&l z=OGJ!48briWe*8#fGl(#3->R`L{%mdnV1-zn3Rd{So;xZ3BO{GpZOH%E+AQDo#-QR ztzhXm0X)ZozYhiLB8dK|;KAaE>|dj@70S>b%I^OGN-4GnR?j5Ir2 zkRylFoDwkkmFsbRq|?suxGg7~k)aB`I}f?!ouR;t9JB904c5pc=zNw_N=o!q25KAMv^7Xnw81crtBN>t$Z6f$Jh8FH;cCu!ni=NP;=^292CVf;a*x^5azP z=P7b!L^}W4FmWh>j{hWpU#=pC4ji3mQL?S(qI7Oc-IV&V)EA}R6rt8*!z)@vrzJCA z83x~F^Z2saG>pa8M&tILxgx|@UIGX`vS#$fQqW8L7=lv9p5RCXHlxo1+=-m>&)<&yMXyQ=OoIsbK0GE z8cgqU)vc{C4Ysz5tMdJ}w){B8fW#nS6*ie93PRqJrATl(zMZt*Sd5UQ=+<5u=CS^m a!<9LOs_IU;r`)Pjb!%g_v$b=znSTJra&SBV diff --git a/PythonEnv/2.7/Lib/genericpath.py b/PythonEnv/2.7/Lib/genericpath.py deleted file mode 100644 index a0bf6013e..000000000 --- a/PythonEnv/2.7/Lib/genericpath.py +++ /dev/null @@ -1,105 +0,0 @@ -""" -Path operations common to more than one OS -Do not use directly. The OS specific modules import the appropriate -functions from this module themselves. -""" -import os -import stat - -__all__ = ['commonprefix', 'exists', 'getatime', 'getctime', 'getmtime', - 'getsize', 'isdir', 'isfile'] - - -# Does a path exist? -# This is false for dangling symbolic links on systems that support them. -def exists(path): - """Test whether a path exists. Returns False for broken symbolic links""" - try: - os.stat(path) - except os.error: - return False - return True - - -# This follows symbolic links, so both islink() and isdir() can be true -# for the same path ono systems that support symlinks -def isfile(path): - """Test whether a path is a regular file""" - try: - st = os.stat(path) - except os.error: - return False - return stat.S_ISREG(st.st_mode) - - -# Is a path a directory? -# This follows symbolic links, so both islink() and isdir() -# can be true for the same path on systems that support symlinks -def isdir(s): - """Return true if the pathname refers to an existing directory.""" - try: - st = os.stat(s) - except os.error: - return False - return stat.S_ISDIR(st.st_mode) - - -def getsize(filename): - """Return the size of a file, reported by os.stat().""" - return os.stat(filename).st_size - - -def getmtime(filename): - """Return the last modification time of a file, reported by os.stat().""" - return os.stat(filename).st_mtime - - -def getatime(filename): - """Return the last access time of a file, reported by os.stat().""" - return os.stat(filename).st_atime - - -def getctime(filename): - """Return the metadata change time of a file, reported by os.stat().""" - return os.stat(filename).st_ctime - - -# Return the longest prefix of all list elements. -def commonprefix(m): - "Given a list of pathnames, returns the longest common leading component" - if not m: return '' - s1 = min(m) - s2 = max(m) - for i, c in enumerate(s1): - if c != s2[i]: - return s1[:i] - return s1 - -# Split a path in root and extension. -# The extension is everything starting at the last dot in the last -# pathname component; the root is everything before that. -# It is always true that root + ext == p. - -# Generic implementation of splitext, to be parametrized with -# the separators -def _splitext(p, sep, altsep, extsep): - """Split the extension from a pathname. - - Extension is everything from the last dot to the end, ignoring - leading dots. Returns "(root, ext)"; ext may be empty.""" - - sepIndex = p.rfind(sep) - if altsep: - altsepIndex = p.rfind(altsep) - sepIndex = max(sepIndex, altsepIndex) - - dotIndex = p.rfind(extsep) - if dotIndex > sepIndex: - # skip all leading dots - filenameIndex = sepIndex + 1 - while filenameIndex < dotIndex: - if p[filenameIndex] != extsep: - return p[:dotIndex], p[dotIndex:] - filenameIndex += 1 - - return p, '' diff --git a/PythonEnv/2.7/Lib/genericpath.pyc b/PythonEnv/2.7/Lib/genericpath.pyc deleted file mode 100644 index 207b17bb6631655efeab36391b007e52fe3ad77a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3633 zcmcIn&2Jk;6o0$^NbNWzX+cmfj4D8GRa~_~RM1kWno@cIs&!FOFj(u|u`|u?>~>}x zVw9Zd331^D2X09Gf&2mRd$V?$MwOrx+nMJ#-|zkAeWmv2TKn;j)6Wu`e@@}|V>J6S zNJ_K~8c-Ti7SJ}BiVtZ!q_jq9oze!SO-ffNJw<7Y(l$*_(Ke=5=`prrLB}&#w&ocu ze#tY~vhEpd-0%#xZ+fOp>1ofbQhLTS9hRZreVIl31*Cm1b~~adrHP#?v=vE_=YLiOXg^A@1++q_Cw-)L13hmQFKih04pqI2<5F zT$ZLNjf$OYkEc4RZW@~+$F#EZExa_hGTW23*H(Yw^SSFl#7d&l$g$dYO$^9=Wu0{l z@kBbvoy$cBM?dN0zOzy-v+8^48sL?M@ctZS$10OafI)6Nc?-?H12WqrNAxhD1EL=S z3LfZJsLmrH?Y7BuDF^~rqyAT}4mf$c-2%BUtrOqvNT^~&EJ_Bq5*J8C(oGE@{v^%- z;kYnjWQtv>g`MT2A_I1r(z~|Hg18W*us9tjLq{*VGzO6Jv_Ha6-ZxX}@Ao~vu#0)} z#C{4c{a`RrZf80gJW%>(Ha0Rn#*LI7Y{}7dGPpN$JB7Zj_XbybR|lCI4JJ}cqY^%| zSI#0am?F=6SVRS?H7-yh!XN4M{I-nt=-Q+8R{XpL7eXWg;@ zf!SCZ%Z?3?_BN^XWbVj?nf3k|$E~|j z#0KC2bl&Ep4ep~Y!{GQ~-$r{DetbK>o_AOl;<&fMN#|B{88Zt|5QsPkh++&2V#~P* zOgKi#RE%b#uswFP?)hG~#=DLzYGFIPx$-og;sY4hWhu|zbP3I}mJ}XEsehp~V{%OC zEJjR%;d6BML0)iNe0~^MYjz>t?Qw`Wi!4ij4t($OjnA+DhuC&f|2Rpch4sIP=04Lb zUvpOY{r{%<&8Ia-DvZYy z!|kgKjSPd3H0MLwzrxWSNd*~Y>zg-e5Yl0d4v}Z@hlv`U-K~+i#7oc-{YRJR0r8P|}^dyB!4VLxp67r_+rI^eI9KH63D3z~F*zdG&K$^6C) zUi8(&725xZ4pw+>m&p9ehoXBH&%{smlkYc4@Nkpf7$ewY8e6Yo>!WW`X!vVT=kku8dQ|Q^sV&M~;cL*UPUB$SYqteHw~yvgZOA=oP#W=@&MQ{DIfv8~wJ@?N z+kn*RMWH6TFj(e~SeOA8*<+>OxvnV+cM^rJMB>zkl=^NR?#S z^37Q3G~z;{%a7m4T2l3S5^_}?u7ei2%#U<2 zu!L;xjeThO4It8&xWlrV)Lajm!Fq5yTn{>78{9^4I@k=mzCPm$YB)@bWH>yLkB7rJ z%P{Kk;$@L90~xP~%{AgE8nMAfXcS!ld7_!;{@3c*BYwU5-{%HPVfn$D>_yOQz0q22 Oby}@f!+)Et&A$PVpj(0f diff --git a/PythonEnv/2.7/Lib/linecache.py b/PythonEnv/2.7/Lib/linecache.py deleted file mode 100644 index 811f27fe3..000000000 --- a/PythonEnv/2.7/Lib/linecache.py +++ /dev/null @@ -1,135 +0,0 @@ -"""Cache lines from files. - -This is intended to read lines from modules imported -- hence if a filename -is not found, it will look down the module search path for a file by -that name. -""" - -import sys -import os - -__all__ = ["getline", "clearcache", "checkcache"] - -def getline(filename, lineno, module_globals=None): - lines = getlines(filename, module_globals) - if 1 <= lineno <= len(lines): - return lines[lineno-1] - else: - return '' - - -# The cache - -cache = {} # The cache - - -def clearcache(): - """Clear the cache entirely.""" - - global cache - cache = {} - - -def getlines(filename, module_globals=None): - """Get the lines for a file from the cache. - Update the cache if it doesn't contain an entry for this file already.""" - - if filename in cache: - return cache[filename][2] - else: - return updatecache(filename, module_globals) - - -def checkcache(filename=None): - """Discard cache entries that are out of date. - (This is not checked upon each call!)""" - - if filename is None: - filenames = cache.keys() - else: - if filename in cache: - filenames = [filename] - else: - return - - for filename in filenames: - size, mtime, lines, fullname = cache[filename] - if mtime is None: - continue # no-op for files loaded via a __loader__ - try: - stat = os.stat(fullname) - except os.error: - del cache[filename] - continue - if size != stat.st_size or mtime != stat.st_mtime: - del cache[filename] - - -def updatecache(filename, module_globals=None): - """Update a cache entry and return its list of lines. - If something's wrong, print a message, discard the cache entry, - and return an empty list.""" - - if filename in cache: - del cache[filename] - if not filename or (filename.startswith('<') and filename.endswith('>')): - return [] - - fullname = filename - try: - stat = os.stat(fullname) - except OSError: - basename = filename - - # Try for a __loader__, if available - if module_globals and '__loader__' in module_globals: - name = module_globals.get('__name__') - loader = module_globals['__loader__'] - get_source = getattr(loader, 'get_source', None) - - if name and get_source: - try: - data = get_source(name) - except (ImportError, IOError): - pass - else: - if data is None: - # No luck, the PEP302 loader cannot find the source - # for this module. - return [] - cache[filename] = ( - len(data), None, - [line+'\n' for line in data.splitlines()], fullname - ) - return cache[filename][2] - - # Try looking through the module search path, which is only useful - # when handling a relative filename. - if os.path.isabs(filename): - return [] - - for dirname in sys.path: - # When using imputil, sys.path may contain things other than - # strings; ignore them when it happens. - try: - fullname = os.path.join(dirname, basename) - except (TypeError, AttributeError): - # Not sufficiently string-like to do anything useful with. - continue - try: - stat = os.stat(fullname) - break - except os.error: - pass - else: - return [] - try: - with open(fullname, 'rU') as fp: - lines = fp.readlines() - except IOError: - return [] - if lines and not lines[-1].endswith('\n'): - lines[-1] += '\n' - size, mtime = stat.st_size, stat.st_mtime - cache[filename] = size, mtime, lines, fullname - return lines diff --git a/PythonEnv/2.7/Lib/linecache.pyc b/PythonEnv/2.7/Lib/linecache.pyc deleted file mode 100644 index a25f78daa33efe126dab96cca63928f65dc6e81f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3433 zcmcIn-EJF26h5=-pLpvuA?cqBs-{S&Mx?ob3sgu8RZ|cbq_Ck%RJmAd@7msYv+L}P zX1-D%A0EkE66%Y>q-#NRf^8l^m8K0Rsb7szW{wD6ftKN&3)35tf zeq8*1j%Ft4LZV0L6@?BZiXMR|Xons-6uJ~vD6G=ZrAMGKQ==DPt5Qr9)F`ae3rMKT z(uypt2;C66A+#s7$Mk;t9H0Cfx_d!?6zL>RBclg-cB}_+5}9q!`)(8)&EM2UX&8mt zW;&08@GS3f7EZyfb43+*tSH+ei;+vu6=9e<$l{Yh%Ig%)C^95vuA!bEvjaP7cfO8&X0YP_|WW69U zwpy;5HVBf=d;u!_q%(}|Xxi%>#Od8+kVoMesu!o7-KaMmcD|X}QI_6Mf9QO;{c$IW zduVASfNW1@J_}t%GkjT6YwBIqboxy5hZPc}7+Cf)anF5G&$M`v!4}JjL>;9z&ZA_u zz1J2n`1Z20y!~refe*ThW*Bs;^!bMyBQBSJ9|UX+OOI=mUnx!Af(cvuY+L8MtPG2#8%l(*w~A)lp2p|lBn)hH1_}5+Ts+JoliskppQSd4QyruXQ9cu| zwj5mS20BPMsAk(S-+NEs^%-)@5jqvo1&X}xv%~mouO+Cj(Ouq{SnhcCG$vMiuRxW#CY#Men|^xDEPNJ z6plTL7c%hK%M53QU-H#^a-oa3`N$NCJAR9e+@Hl#(!9o z573N8$NsbCun$$7Rdq=Bc z2IZDr4ep5JTx!ATU<|kvig4JV=PoTUtjdNu_p^1H%M5Q@!Eu-2p$$SEf>M0w-|VC( zx76VrmAN6I^AGWj5$Kr0Hq2rS`l!j#wEK9S77d!Cc-QFi_YR$S3T{29l(6g+<*S9- z-`YRfQ9y}9VwH~0GcXK^ulRtc&&aOv!tUcCEj*gFP8o4$kLFMn@#o;qS8?aJ$Znk8 z`4VHbh&m!!W; z&SI4ofMJ#9=$m~05;u&?_s`F8yfS+SX99kPTpi-AW2bqFOm6VvF%tDs4vMhF>x(rrS-jAdK>ES0cIF!*I6*LXA=}t zX6NcDcJbfB$lpNMW+j%T(!az*QH-;2FEGX9i^VKoVS=y!Hs(Y=5_}*8%NFIsI2Uft zaf6AZRsRBL|023KlTI1pT{P1{N7bhC)O)Jp6lru-)!Yrd+B~&^BZ-sH2t`3$4ap!j^a^`>rU}RzQd0Z!?vzTfkBz^YHp+6^qQ^z0XoX~ AJOBUy diff --git a/PythonEnv/2.7/Lib/locale.py b/PythonEnv/2.7/Lib/locale.py deleted file mode 100644 index 7ddfdb782..000000000 --- a/PythonEnv/2.7/Lib/locale.py +++ /dev/null @@ -1,1882 +0,0 @@ -""" Locale support. - - The module provides low-level access to the C lib's locale APIs - and adds high level number formatting APIs as well as a locale - aliasing engine to complement these. - - The aliasing engine includes support for many commonly used locale - names and maps them to values suitable for passing to the C lib's - setlocale() function. It also includes default encodings for all - supported locale names. - -""" - -import sys -import encodings -import encodings.aliases -import re -import operator -import functools - -try: - _unicode = unicode -except NameError: - # If Python is built without Unicode support, the unicode type - # will not exist. Fake one. - class _unicode(object): - pass - -# Try importing the _locale module. -# -# If this fails, fall back on a basic 'C' locale emulation. - -# Yuck: LC_MESSAGES is non-standard: can't tell whether it exists before -# trying the import. So __all__ is also fiddled at the end of the file. -__all__ = ["getlocale", "getdefaultlocale", "getpreferredencoding", "Error", - "setlocale", "resetlocale", "localeconv", "strcoll", "strxfrm", - "str", "atof", "atoi", "format", "format_string", "currency", - "normalize", "LC_CTYPE", "LC_COLLATE", "LC_TIME", "LC_MONETARY", - "LC_NUMERIC", "LC_ALL", "CHAR_MAX"] - -try: - - from _locale import * - -except ImportError: - - # Locale emulation - - CHAR_MAX = 127 - LC_ALL = 6 - LC_COLLATE = 3 - LC_CTYPE = 0 - LC_MESSAGES = 5 - LC_MONETARY = 4 - LC_NUMERIC = 1 - LC_TIME = 2 - Error = ValueError - - def localeconv(): - """ localeconv() -> dict. - Returns numeric and monetary locale-specific parameters. - """ - # 'C' locale default values - return {'grouping': [127], - 'currency_symbol': '', - 'n_sign_posn': 127, - 'p_cs_precedes': 127, - 'n_cs_precedes': 127, - 'mon_grouping': [], - 'n_sep_by_space': 127, - 'decimal_point': '.', - 'negative_sign': '', - 'positive_sign': '', - 'p_sep_by_space': 127, - 'int_curr_symbol': '', - 'p_sign_posn': 127, - 'thousands_sep': '', - 'mon_thousands_sep': '', - 'frac_digits': 127, - 'mon_decimal_point': '', - 'int_frac_digits': 127} - - def setlocale(category, value=None): - """ setlocale(integer,string=None) -> string. - Activates/queries locale processing. - """ - if value not in (None, '', 'C'): - raise Error, '_locale emulation only supports "C" locale' - return 'C' - - def strcoll(a,b): - """ strcoll(string,string) -> int. - Compares two strings according to the locale. - """ - return cmp(a,b) - - def strxfrm(s): - """ strxfrm(string) -> string. - Returns a string that behaves for cmp locale-aware. - """ - return s - - -_localeconv = localeconv - -# With this dict, you can override some items of localeconv's return value. -# This is useful for testing purposes. -_override_localeconv = {} - -@functools.wraps(_localeconv) -def localeconv(): - d = _localeconv() - if _override_localeconv: - d.update(_override_localeconv) - return d - - -### Number formatting APIs - -# Author: Martin von Loewis -# improved by Georg Brandl - -# Iterate over grouping intervals -def _grouping_intervals(grouping): - last_interval = None - for interval in grouping: - # if grouping is -1, we are done - if interval == CHAR_MAX: - return - # 0: re-use last group ad infinitum - if interval == 0: - if last_interval is None: - raise ValueError("invalid grouping") - while True: - yield last_interval - yield interval - last_interval = interval - -#perform the grouping from right to left -def _group(s, monetary=False): - conv = localeconv() - thousands_sep = conv[monetary and 'mon_thousands_sep' or 'thousands_sep'] - grouping = conv[monetary and 'mon_grouping' or 'grouping'] - if not grouping: - return (s, 0) - if s[-1] == ' ': - stripped = s.rstrip() - right_spaces = s[len(stripped):] - s = stripped - else: - right_spaces = '' - left_spaces = '' - groups = [] - for interval in _grouping_intervals(grouping): - if not s or s[-1] not in "0123456789": - # only non-digit characters remain (sign, spaces) - left_spaces = s - s = '' - break - groups.append(s[-interval:]) - s = s[:-interval] - if s: - groups.append(s) - groups.reverse() - return ( - left_spaces + thousands_sep.join(groups) + right_spaces, - len(thousands_sep) * (len(groups) - 1) - ) - -# Strip a given amount of excess padding from the given string -def _strip_padding(s, amount): - lpos = 0 - while amount and s[lpos] == ' ': - lpos += 1 - amount -= 1 - rpos = len(s) - 1 - while amount and s[rpos] == ' ': - rpos -= 1 - amount -= 1 - return s[lpos:rpos+1] - -_percent_re = re.compile(r'%(?:\((?P.*?)\))?' - r'(?P[-#0-9 +*.hlL]*?)[eEfFgGdiouxXcrs%]') - -def format(percent, value, grouping=False, monetary=False, *additional): - """Returns the locale-aware substitution of a %? specifier - (percent). - - additional is for format strings which contain one or more - '*' modifiers.""" - # this is only for one-percent-specifier strings and this should be checked - match = _percent_re.match(percent) - if not match or len(match.group())!= len(percent): - raise ValueError(("format() must be given exactly one %%char " - "format specifier, %s not valid") % repr(percent)) - return _format(percent, value, grouping, monetary, *additional) - -def _format(percent, value, grouping=False, monetary=False, *additional): - if additional: - formatted = percent % ((value,) + additional) - else: - formatted = percent % value - # floats and decimal ints need special action! - if percent[-1] in 'eEfFgG': - seps = 0 - parts = formatted.split('.') - if grouping: - parts[0], seps = _group(parts[0], monetary=monetary) - decimal_point = localeconv()[monetary and 'mon_decimal_point' - or 'decimal_point'] - formatted = decimal_point.join(parts) - if seps: - formatted = _strip_padding(formatted, seps) - elif percent[-1] in 'diu': - seps = 0 - if grouping: - formatted, seps = _group(formatted, monetary=monetary) - if seps: - formatted = _strip_padding(formatted, seps) - return formatted - -def format_string(f, val, grouping=False): - """Formats a string in the same way that the % formatting would use, - but takes the current locale into account. - Grouping is applied if the third parameter is true.""" - percents = list(_percent_re.finditer(f)) - new_f = _percent_re.sub('%s', f) - - if operator.isMappingType(val): - new_val = [] - for perc in percents: - if perc.group()[-1]=='%': - new_val.append('%') - else: - new_val.append(format(perc.group(), val, grouping)) - else: - if not isinstance(val, tuple): - val = (val,) - new_val = [] - i = 0 - for perc in percents: - if perc.group()[-1]=='%': - new_val.append('%') - else: - starcount = perc.group('modifiers').count('*') - new_val.append(_format(perc.group(), - val[i], - grouping, - False, - *val[i+1:i+1+starcount])) - i += (1 + starcount) - val = tuple(new_val) - - return new_f % val - -def currency(val, symbol=True, grouping=False, international=False): - """Formats val according to the currency settings - in the current locale.""" - conv = localeconv() - - # check for illegal values - digits = conv[international and 'int_frac_digits' or 'frac_digits'] - if digits == 127: - raise ValueError("Currency formatting is not possible using " - "the 'C' locale.") - - s = format('%%.%if' % digits, abs(val), grouping, monetary=True) - # '<' and '>' are markers if the sign must be inserted between symbol and value - s = '<' + s + '>' - - if symbol: - smb = conv[international and 'int_curr_symbol' or 'currency_symbol'] - precedes = conv[val<0 and 'n_cs_precedes' or 'p_cs_precedes'] - separated = conv[val<0 and 'n_sep_by_space' or 'p_sep_by_space'] - - if precedes: - s = smb + (separated and ' ' or '') + s - else: - s = s + (separated and ' ' or '') + smb - - sign_pos = conv[val<0 and 'n_sign_posn' or 'p_sign_posn'] - sign = conv[val<0 and 'negative_sign' or 'positive_sign'] - - if sign_pos == 0: - s = '(' + s + ')' - elif sign_pos == 1: - s = sign + s - elif sign_pos == 2: - s = s + sign - elif sign_pos == 3: - s = s.replace('<', sign) - elif sign_pos == 4: - s = s.replace('>', sign) - else: - # the default if nothing specified; - # this should be the most fitting sign position - s = sign + s - - return s.replace('<', '').replace('>', '') - -def str(val): - """Convert float to integer, taking the locale into account.""" - return format("%.12g", val) - -def atof(string, func=float): - "Parses a string as a float according to the locale settings." - #First, get rid of the grouping - ts = localeconv()['thousands_sep'] - if ts: - string = string.replace(ts, '') - #next, replace the decimal point with a dot - dd = localeconv()['decimal_point'] - if dd: - string = string.replace(dd, '.') - #finally, parse the string - return func(string) - -def atoi(str): - "Converts a string to an integer according to the locale settings." - return atof(str, int) - -def _test(): - setlocale(LC_ALL, "") - #do grouping - s1 = format("%d", 123456789,1) - print s1, "is", atoi(s1) - #standard formatting - s1 = str(3.14) - print s1, "is", atof(s1) - -### Locale name aliasing engine - -# Author: Marc-Andre Lemburg, mal@lemburg.com -# Various tweaks by Fredrik Lundh - -# store away the low-level version of setlocale (it's -# overridden below) -_setlocale = setlocale - -# Avoid relying on the locale-dependent .lower() method -# (see issue #1813). -_ascii_lower_map = ''.join( - chr(x + 32 if x >= ord('A') and x <= ord('Z') else x) - for x in range(256) -) - -def normalize(localename): - - """ Returns a normalized locale code for the given locale - name. - - The returned locale code is formatted for use with - setlocale(). - - If normalization fails, the original name is returned - unchanged. - - If the given encoding is not known, the function defaults to - the default encoding for the locale code just like setlocale() - does. - - """ - # Normalize the locale name and extract the encoding - if isinstance(localename, _unicode): - localename = localename.encode('ascii') - fullname = localename.translate(_ascii_lower_map) - if ':' in fullname: - # ':' is sometimes used as encoding delimiter. - fullname = fullname.replace(':', '.') - if '.' in fullname: - langname, encoding = fullname.split('.')[:2] - fullname = langname + '.' + encoding - else: - langname = fullname - encoding = '' - - # First lookup: fullname (possibly with encoding) - norm_encoding = encoding.replace('-', '') - norm_encoding = norm_encoding.replace('_', '') - lookup_name = langname + '.' + encoding - code = locale_alias.get(lookup_name, None) - if code is not None: - return code - #print 'first lookup failed' - - # Second try: langname (without encoding) - code = locale_alias.get(langname, None) - if code is not None: - #print 'langname lookup succeeded' - if '.' in code: - langname, defenc = code.split('.') - else: - langname = code - defenc = '' - if encoding: - # Convert the encoding to a C lib compatible encoding string - norm_encoding = encodings.normalize_encoding(encoding) - #print 'norm encoding: %r' % norm_encoding - norm_encoding = encodings.aliases.aliases.get(norm_encoding, - norm_encoding) - #print 'aliased encoding: %r' % norm_encoding - encoding = locale_encoding_alias.get(norm_encoding, - norm_encoding) - else: - encoding = defenc - #print 'found encoding %r' % encoding - if encoding: - return langname + '.' + encoding - else: - return langname - - else: - return localename - -def _parse_localename(localename): - - """ Parses the locale code for localename and returns the - result as tuple (language code, encoding). - - The localename is normalized and passed through the locale - alias engine. A ValueError is raised in case the locale name - cannot be parsed. - - The language code corresponds to RFC 1766. code and encoding - can be None in case the values cannot be determined or are - unknown to this implementation. - - """ - code = normalize(localename) - if '@' in code: - # Deal with locale modifiers - code, modifier = code.split('@') - if modifier == 'euro' and '.' not in code: - # Assume Latin-9 for @euro locales. This is bogus, - # since some systems may use other encodings for these - # locales. Also, we ignore other modifiers. - return code, 'iso-8859-15' - - if '.' in code: - return tuple(code.split('.')[:2]) - elif code == 'C': - return None, None - raise ValueError, 'unknown locale: %s' % localename - -def _build_localename(localetuple): - - """ Builds a locale code from the given tuple (language code, - encoding). - - No aliasing or normalizing takes place. - - """ - language, encoding = localetuple - if language is None: - language = 'C' - if encoding is None: - return language - else: - return language + '.' + encoding - -def getdefaultlocale(envvars=('LC_ALL', 'LC_CTYPE', 'LANG', 'LANGUAGE')): - - """ Tries to determine the default locale settings and returns - them as tuple (language code, encoding). - - According to POSIX, a program which has not called - setlocale(LC_ALL, "") runs using the portable 'C' locale. - Calling setlocale(LC_ALL, "") lets it use the default locale as - defined by the LANG variable. Since we don't want to interfere - with the current locale setting we thus emulate the behavior - in the way described above. - - To maintain compatibility with other platforms, not only the - LANG variable is tested, but a list of variables given as - envvars parameter. The first found to be defined will be - used. envvars defaults to the search path used in GNU gettext; - it must always contain the variable name 'LANG'. - - Except for the code 'C', the language code corresponds to RFC - 1766. code and encoding can be None in case the values cannot - be determined. - - """ - - try: - # check if it's supported by the _locale module - import _locale - code, encoding = _locale._getdefaultlocale() - except (ImportError, AttributeError): - pass - else: - # make sure the code/encoding values are valid - if sys.platform == "win32" and code and code[:2] == "0x": - # map windows language identifier to language name - code = windows_locale.get(int(code, 0)) - # ...add other platform-specific processing here, if - # necessary... - return code, encoding - - # fall back on POSIX behaviour - import os - lookup = os.environ.get - for variable in envvars: - localename = lookup(variable,None) - if localename: - if variable == 'LANGUAGE': - localename = localename.split(':')[0] - break - else: - localename = 'C' - return _parse_localename(localename) - - -def getlocale(category=LC_CTYPE): - - """ Returns the current setting for the given locale category as - tuple (language code, encoding). - - category may be one of the LC_* value except LC_ALL. It - defaults to LC_CTYPE. - - Except for the code 'C', the language code corresponds to RFC - 1766. code and encoding can be None in case the values cannot - be determined. - - """ - localename = _setlocale(category) - if category == LC_ALL and ';' in localename: - raise TypeError, 'category LC_ALL is not supported' - return _parse_localename(localename) - -def setlocale(category, locale=None): - - """ Set the locale for the given category. The locale can be - a string, an iterable of two strings (language code and encoding), - or None. - - Iterables are converted to strings using the locale aliasing - engine. Locale strings are passed directly to the C lib. - - category may be given as one of the LC_* values. - - """ - if locale and type(locale) is not type(""): - # convert to string - locale = normalize(_build_localename(locale)) - return _setlocale(category, locale) - -def resetlocale(category=LC_ALL): - - """ Sets the locale for category to the default setting. - - The default setting is determined by calling - getdefaultlocale(). category defaults to LC_ALL. - - """ - _setlocale(category, _build_localename(getdefaultlocale())) - -if sys.platform.startswith("win"): - # On Win32, this will return the ANSI code page - def getpreferredencoding(do_setlocale = True): - """Return the charset that the user is likely using.""" - import _locale - return _locale._getdefaultlocale()[1] -else: - # On Unix, if CODESET is available, use that. - try: - CODESET - except NameError: - # Fall back to parsing environment variables :-( - def getpreferredencoding(do_setlocale = True): - """Return the charset that the user is likely using, - by looking at environment variables.""" - return getdefaultlocale()[1] - else: - def getpreferredencoding(do_setlocale = True): - """Return the charset that the user is likely using, - according to the system configuration.""" - if do_setlocale: - oldloc = setlocale(LC_CTYPE) - try: - setlocale(LC_CTYPE, "") - except Error: - pass - result = nl_langinfo(CODESET) - setlocale(LC_CTYPE, oldloc) - return result - else: - return nl_langinfo(CODESET) - - -### Database -# -# The following data was extracted from the locale.alias file which -# comes with X11 and then hand edited removing the explicit encoding -# definitions and adding some more aliases. The file is usually -# available as /usr/lib/X11/locale/locale.alias. -# - -# -# The local_encoding_alias table maps lowercase encoding alias names -# to C locale encoding names (case-sensitive). Note that normalize() -# first looks up the encoding in the encodings.aliases dictionary and -# then applies this mapping to find the correct C lib name for the -# encoding. -# -locale_encoding_alias = { - - # Mappings for non-standard encoding names used in locale names - '437': 'C', - 'c': 'C', - 'en': 'ISO8859-1', - 'jis': 'JIS7', - 'jis7': 'JIS7', - 'ajec': 'eucJP', - - # Mappings from Python codec names to C lib encoding names - 'ascii': 'ISO8859-1', - 'latin_1': 'ISO8859-1', - 'iso8859_1': 'ISO8859-1', - 'iso8859_10': 'ISO8859-10', - 'iso8859_11': 'ISO8859-11', - 'iso8859_13': 'ISO8859-13', - 'iso8859_14': 'ISO8859-14', - 'iso8859_15': 'ISO8859-15', - 'iso8859_16': 'ISO8859-16', - 'iso8859_2': 'ISO8859-2', - 'iso8859_3': 'ISO8859-3', - 'iso8859_4': 'ISO8859-4', - 'iso8859_5': 'ISO8859-5', - 'iso8859_6': 'ISO8859-6', - 'iso8859_7': 'ISO8859-7', - 'iso8859_8': 'ISO8859-8', - 'iso8859_9': 'ISO8859-9', - 'iso2022_jp': 'JIS7', - 'shift_jis': 'SJIS', - 'tactis': 'TACTIS', - 'euc_jp': 'eucJP', - 'euc_kr': 'eucKR', - 'utf_8': 'UTF-8', - 'koi8_r': 'KOI8-R', - 'koi8_u': 'KOI8-U', - # XXX This list is still incomplete. If you know more - # mappings, please file a bug report. Thanks. -} - -# -# The locale_alias table maps lowercase alias names to C locale names -# (case-sensitive). Encodings are always separated from the locale -# name using a dot ('.'); they should only be given in case the -# language name is needed to interpret the given encoding alias -# correctly (CJK codes often have this need). -# -# Note that the normalize() function which uses this tables -# removes '_' and '-' characters from the encoding part of the -# locale name before doing the lookup. This saves a lot of -# space in the table. -# -# MAL 2004-12-10: -# Updated alias mapping to most recent locale.alias file -# from X.org distribution using makelocalealias.py. -# -# These are the differences compared to the old mapping (Python 2.4 -# and older): -# -# updated 'bg' -> 'bg_BG.ISO8859-5' to 'bg_BG.CP1251' -# updated 'bg_bg' -> 'bg_BG.ISO8859-5' to 'bg_BG.CP1251' -# updated 'bulgarian' -> 'bg_BG.ISO8859-5' to 'bg_BG.CP1251' -# updated 'cz' -> 'cz_CZ.ISO8859-2' to 'cs_CZ.ISO8859-2' -# updated 'cz_cz' -> 'cz_CZ.ISO8859-2' to 'cs_CZ.ISO8859-2' -# updated 'czech' -> 'cs_CS.ISO8859-2' to 'cs_CZ.ISO8859-2' -# updated 'dutch' -> 'nl_BE.ISO8859-1' to 'nl_NL.ISO8859-1' -# updated 'et' -> 'et_EE.ISO8859-4' to 'et_EE.ISO8859-15' -# updated 'et_ee' -> 'et_EE.ISO8859-4' to 'et_EE.ISO8859-15' -# updated 'fi' -> 'fi_FI.ISO8859-1' to 'fi_FI.ISO8859-15' -# updated 'fi_fi' -> 'fi_FI.ISO8859-1' to 'fi_FI.ISO8859-15' -# updated 'iw' -> 'iw_IL.ISO8859-8' to 'he_IL.ISO8859-8' -# updated 'iw_il' -> 'iw_IL.ISO8859-8' to 'he_IL.ISO8859-8' -# updated 'japanese' -> 'ja_JP.SJIS' to 'ja_JP.eucJP' -# updated 'lt' -> 'lt_LT.ISO8859-4' to 'lt_LT.ISO8859-13' -# updated 'lv' -> 'lv_LV.ISO8859-4' to 'lv_LV.ISO8859-13' -# updated 'sl' -> 'sl_CS.ISO8859-2' to 'sl_SI.ISO8859-2' -# updated 'slovene' -> 'sl_CS.ISO8859-2' to 'sl_SI.ISO8859-2' -# updated 'th_th' -> 'th_TH.TACTIS' to 'th_TH.ISO8859-11' -# updated 'zh_cn' -> 'zh_CN.eucCN' to 'zh_CN.gb2312' -# updated 'zh_cn.big5' -> 'zh_TW.eucTW' to 'zh_TW.big5' -# updated 'zh_tw' -> 'zh_TW.eucTW' to 'zh_TW.big5' -# -# MAL 2008-05-30: -# Updated alias mapping to most recent locale.alias file -# from X.org distribution using makelocalealias.py. -# -# These are the differences compared to the old mapping (Python 2.5 -# and older): -# -# updated 'cs_cs.iso88592' -> 'cs_CZ.ISO8859-2' to 'cs_CS.ISO8859-2' -# updated 'serbocroatian' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2' -# updated 'sh' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2' -# updated 'sh_hr.iso88592' -> 'sh_HR.ISO8859-2' to 'hr_HR.ISO8859-2' -# updated 'sh_sp' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2' -# updated 'sh_yu' -> 'sh_YU.ISO8859-2' to 'sr_CS.ISO8859-2' -# updated 'sp' -> 'sp_YU.ISO8859-5' to 'sr_CS.ISO8859-5' -# updated 'sp_yu' -> 'sp_YU.ISO8859-5' to 'sr_CS.ISO8859-5' -# updated 'sr' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' -# updated 'sr@cyrillic' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' -# updated 'sr_sp' -> 'sr_SP.ISO8859-2' to 'sr_CS.ISO8859-2' -# updated 'sr_yu' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' -# updated 'sr_yu.cp1251@cyrillic' -> 'sr_YU.CP1251' to 'sr_CS.CP1251' -# updated 'sr_yu.iso88592' -> 'sr_YU.ISO8859-2' to 'sr_CS.ISO8859-2' -# updated 'sr_yu.iso88595' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' -# updated 'sr_yu.iso88595@cyrillic' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' -# updated 'sr_yu.microsoftcp1251@cyrillic' -> 'sr_YU.CP1251' to 'sr_CS.CP1251' -# updated 'sr_yu.utf8@cyrillic' -> 'sr_YU.UTF-8' to 'sr_CS.UTF-8' -# updated 'sr_yu@cyrillic' -> 'sr_YU.ISO8859-5' to 'sr_CS.ISO8859-5' -# -# AP 2010-04-12: -# Updated alias mapping to most recent locale.alias file -# from X.org distribution using makelocalealias.py. -# -# These are the differences compared to the old mapping (Python 2.6.5 -# and older): -# -# updated 'ru' -> 'ru_RU.ISO8859-5' to 'ru_RU.UTF-8' -# updated 'ru_ru' -> 'ru_RU.ISO8859-5' to 'ru_RU.UTF-8' -# updated 'serbocroatian' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin' -# updated 'sh' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin' -# updated 'sh_yu' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin' -# updated 'sr' -> 'sr_CS.ISO8859-5' to 'sr_RS.UTF-8' -# updated 'sr@cyrillic' -> 'sr_CS.ISO8859-5' to 'sr_RS.UTF-8' -# updated 'sr@latn' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin' -# updated 'sr_cs.utf8@latn' -> 'sr_CS.UTF-8' to 'sr_RS.UTF-8@latin' -# updated 'sr_cs@latn' -> 'sr_CS.ISO8859-2' to 'sr_RS.UTF-8@latin' -# updated 'sr_yu' -> 'sr_CS.ISO8859-5' to 'sr_RS.UTF-8@latin' -# updated 'sr_yu.utf8@cyrillic' -> 'sr_CS.UTF-8' to 'sr_RS.UTF-8' -# updated 'sr_yu@cyrillic' -> 'sr_CS.ISO8859-5' to 'sr_RS.UTF-8' -# - -locale_alias = { - 'a3': 'a3_AZ.KOI8-C', - 'a3_az': 'a3_AZ.KOI8-C', - 'a3_az.koi8c': 'a3_AZ.KOI8-C', - 'af': 'af_ZA.ISO8859-1', - 'af_za': 'af_ZA.ISO8859-1', - 'af_za.iso88591': 'af_ZA.ISO8859-1', - 'am': 'am_ET.UTF-8', - 'am_et': 'am_ET.UTF-8', - 'american': 'en_US.ISO8859-1', - 'american.iso88591': 'en_US.ISO8859-1', - 'ar': 'ar_AA.ISO8859-6', - 'ar_aa': 'ar_AA.ISO8859-6', - 'ar_aa.iso88596': 'ar_AA.ISO8859-6', - 'ar_ae': 'ar_AE.ISO8859-6', - 'ar_ae.iso88596': 'ar_AE.ISO8859-6', - 'ar_bh': 'ar_BH.ISO8859-6', - 'ar_bh.iso88596': 'ar_BH.ISO8859-6', - 'ar_dz': 'ar_DZ.ISO8859-6', - 'ar_dz.iso88596': 'ar_DZ.ISO8859-6', - 'ar_eg': 'ar_EG.ISO8859-6', - 'ar_eg.iso88596': 'ar_EG.ISO8859-6', - 'ar_iq': 'ar_IQ.ISO8859-6', - 'ar_iq.iso88596': 'ar_IQ.ISO8859-6', - 'ar_jo': 'ar_JO.ISO8859-6', - 'ar_jo.iso88596': 'ar_JO.ISO8859-6', - 'ar_kw': 'ar_KW.ISO8859-6', - 'ar_kw.iso88596': 'ar_KW.ISO8859-6', - 'ar_lb': 'ar_LB.ISO8859-6', - 'ar_lb.iso88596': 'ar_LB.ISO8859-6', - 'ar_ly': 'ar_LY.ISO8859-6', - 'ar_ly.iso88596': 'ar_LY.ISO8859-6', - 'ar_ma': 'ar_MA.ISO8859-6', - 'ar_ma.iso88596': 'ar_MA.ISO8859-6', - 'ar_om': 'ar_OM.ISO8859-6', - 'ar_om.iso88596': 'ar_OM.ISO8859-6', - 'ar_qa': 'ar_QA.ISO8859-6', - 'ar_qa.iso88596': 'ar_QA.ISO8859-6', - 'ar_sa': 'ar_SA.ISO8859-6', - 'ar_sa.iso88596': 'ar_SA.ISO8859-6', - 'ar_sd': 'ar_SD.ISO8859-6', - 'ar_sd.iso88596': 'ar_SD.ISO8859-6', - 'ar_sy': 'ar_SY.ISO8859-6', - 'ar_sy.iso88596': 'ar_SY.ISO8859-6', - 'ar_tn': 'ar_TN.ISO8859-6', - 'ar_tn.iso88596': 'ar_TN.ISO8859-6', - 'ar_ye': 'ar_YE.ISO8859-6', - 'ar_ye.iso88596': 'ar_YE.ISO8859-6', - 'arabic': 'ar_AA.ISO8859-6', - 'arabic.iso88596': 'ar_AA.ISO8859-6', - 'as': 'as_IN.UTF-8', - 'az': 'az_AZ.ISO8859-9E', - 'az_az': 'az_AZ.ISO8859-9E', - 'az_az.iso88599e': 'az_AZ.ISO8859-9E', - 'be': 'be_BY.CP1251', - 'be@latin': 'be_BY.UTF-8@latin', - 'be_by': 'be_BY.CP1251', - 'be_by.cp1251': 'be_BY.CP1251', - 'be_by.microsoftcp1251': 'be_BY.CP1251', - 'be_by.utf8@latin': 'be_BY.UTF-8@latin', - 'be_by@latin': 'be_BY.UTF-8@latin', - 'bg': 'bg_BG.CP1251', - 'bg_bg': 'bg_BG.CP1251', - 'bg_bg.cp1251': 'bg_BG.CP1251', - 'bg_bg.iso88595': 'bg_BG.ISO8859-5', - 'bg_bg.koi8r': 'bg_BG.KOI8-R', - 'bg_bg.microsoftcp1251': 'bg_BG.CP1251', - 'bn_in': 'bn_IN.UTF-8', - 'bokmal': 'nb_NO.ISO8859-1', - 'bokm\xe5l': 'nb_NO.ISO8859-1', - 'br': 'br_FR.ISO8859-1', - 'br_fr': 'br_FR.ISO8859-1', - 'br_fr.iso88591': 'br_FR.ISO8859-1', - 'br_fr.iso885914': 'br_FR.ISO8859-14', - 'br_fr.iso885915': 'br_FR.ISO8859-15', - 'br_fr.iso885915@euro': 'br_FR.ISO8859-15', - 'br_fr.utf8@euro': 'br_FR.UTF-8', - 'br_fr@euro': 'br_FR.ISO8859-15', - 'bs': 'bs_BA.ISO8859-2', - 'bs_ba': 'bs_BA.ISO8859-2', - 'bs_ba.iso88592': 'bs_BA.ISO8859-2', - 'bulgarian': 'bg_BG.CP1251', - 'c': 'C', - 'c-french': 'fr_CA.ISO8859-1', - 'c-french.iso88591': 'fr_CA.ISO8859-1', - 'c.en': 'C', - 'c.iso88591': 'en_US.ISO8859-1', - 'c_c': 'C', - 'c_c.c': 'C', - 'ca': 'ca_ES.ISO8859-1', - 'ca_ad': 'ca_AD.ISO8859-1', - 'ca_ad.iso88591': 'ca_AD.ISO8859-1', - 'ca_ad.iso885915': 'ca_AD.ISO8859-15', - 'ca_ad.iso885915@euro': 'ca_AD.ISO8859-15', - 'ca_ad.utf8@euro': 'ca_AD.UTF-8', - 'ca_ad@euro': 'ca_AD.ISO8859-15', - 'ca_es': 'ca_ES.ISO8859-1', - 'ca_es.iso88591': 'ca_ES.ISO8859-1', - 'ca_es.iso885915': 'ca_ES.ISO8859-15', - 'ca_es.iso885915@euro': 'ca_ES.ISO8859-15', - 'ca_es.utf8@euro': 'ca_ES.UTF-8', - 'ca_es@euro': 'ca_ES.ISO8859-15', - 'ca_fr': 'ca_FR.ISO8859-1', - 'ca_fr.iso88591': 'ca_FR.ISO8859-1', - 'ca_fr.iso885915': 'ca_FR.ISO8859-15', - 'ca_fr.iso885915@euro': 'ca_FR.ISO8859-15', - 'ca_fr.utf8@euro': 'ca_FR.UTF-8', - 'ca_fr@euro': 'ca_FR.ISO8859-15', - 'ca_it': 'ca_IT.ISO8859-1', - 'ca_it.iso88591': 'ca_IT.ISO8859-1', - 'ca_it.iso885915': 'ca_IT.ISO8859-15', - 'ca_it.iso885915@euro': 'ca_IT.ISO8859-15', - 'ca_it.utf8@euro': 'ca_IT.UTF-8', - 'ca_it@euro': 'ca_IT.ISO8859-15', - 'catalan': 'ca_ES.ISO8859-1', - 'cextend': 'en_US.ISO8859-1', - 'cextend.en': 'en_US.ISO8859-1', - 'chinese-s': 'zh_CN.eucCN', - 'chinese-t': 'zh_TW.eucTW', - 'croatian': 'hr_HR.ISO8859-2', - 'cs': 'cs_CZ.ISO8859-2', - 'cs_cs': 'cs_CZ.ISO8859-2', - 'cs_cs.iso88592': 'cs_CS.ISO8859-2', - 'cs_cz': 'cs_CZ.ISO8859-2', - 'cs_cz.iso88592': 'cs_CZ.ISO8859-2', - 'cy': 'cy_GB.ISO8859-1', - 'cy_gb': 'cy_GB.ISO8859-1', - 'cy_gb.iso88591': 'cy_GB.ISO8859-1', - 'cy_gb.iso885914': 'cy_GB.ISO8859-14', - 'cy_gb.iso885915': 'cy_GB.ISO8859-15', - 'cy_gb@euro': 'cy_GB.ISO8859-15', - 'cz': 'cs_CZ.ISO8859-2', - 'cz_cz': 'cs_CZ.ISO8859-2', - 'czech': 'cs_CZ.ISO8859-2', - 'da': 'da_DK.ISO8859-1', - 'da.iso885915': 'da_DK.ISO8859-15', - 'da_dk': 'da_DK.ISO8859-1', - 'da_dk.88591': 'da_DK.ISO8859-1', - 'da_dk.885915': 'da_DK.ISO8859-15', - 'da_dk.iso88591': 'da_DK.ISO8859-1', - 'da_dk.iso885915': 'da_DK.ISO8859-15', - 'da_dk@euro': 'da_DK.ISO8859-15', - 'danish': 'da_DK.ISO8859-1', - 'danish.iso88591': 'da_DK.ISO8859-1', - 'dansk': 'da_DK.ISO8859-1', - 'de': 'de_DE.ISO8859-1', - 'de.iso885915': 'de_DE.ISO8859-15', - 'de_at': 'de_AT.ISO8859-1', - 'de_at.iso88591': 'de_AT.ISO8859-1', - 'de_at.iso885915': 'de_AT.ISO8859-15', - 'de_at.iso885915@euro': 'de_AT.ISO8859-15', - 'de_at.utf8@euro': 'de_AT.UTF-8', - 'de_at@euro': 'de_AT.ISO8859-15', - 'de_be': 'de_BE.ISO8859-1', - 'de_be.iso88591': 'de_BE.ISO8859-1', - 'de_be.iso885915': 'de_BE.ISO8859-15', - 'de_be.iso885915@euro': 'de_BE.ISO8859-15', - 'de_be.utf8@euro': 'de_BE.UTF-8', - 'de_be@euro': 'de_BE.ISO8859-15', - 'de_ch': 'de_CH.ISO8859-1', - 'de_ch.iso88591': 'de_CH.ISO8859-1', - 'de_ch.iso885915': 'de_CH.ISO8859-15', - 'de_ch@euro': 'de_CH.ISO8859-15', - 'de_de': 'de_DE.ISO8859-1', - 'de_de.88591': 'de_DE.ISO8859-1', - 'de_de.885915': 'de_DE.ISO8859-15', - 'de_de.885915@euro': 'de_DE.ISO8859-15', - 'de_de.iso88591': 'de_DE.ISO8859-1', - 'de_de.iso885915': 'de_DE.ISO8859-15', - 'de_de.iso885915@euro': 'de_DE.ISO8859-15', - 'de_de.utf8@euro': 'de_DE.UTF-8', - 'de_de@euro': 'de_DE.ISO8859-15', - 'de_lu': 'de_LU.ISO8859-1', - 'de_lu.iso88591': 'de_LU.ISO8859-1', - 'de_lu.iso885915': 'de_LU.ISO8859-15', - 'de_lu.iso885915@euro': 'de_LU.ISO8859-15', - 'de_lu.utf8@euro': 'de_LU.UTF-8', - 'de_lu@euro': 'de_LU.ISO8859-15', - 'deutsch': 'de_DE.ISO8859-1', - 'dutch': 'nl_NL.ISO8859-1', - 'dutch.iso88591': 'nl_BE.ISO8859-1', - 'ee': 'ee_EE.ISO8859-4', - 'ee_ee': 'ee_EE.ISO8859-4', - 'ee_ee.iso88594': 'ee_EE.ISO8859-4', - 'eesti': 'et_EE.ISO8859-1', - 'el': 'el_GR.ISO8859-7', - 'el_gr': 'el_GR.ISO8859-7', - 'el_gr.iso88597': 'el_GR.ISO8859-7', - 'el_gr@euro': 'el_GR.ISO8859-15', - 'en': 'en_US.ISO8859-1', - 'en.iso88591': 'en_US.ISO8859-1', - 'en_au': 'en_AU.ISO8859-1', - 'en_au.iso88591': 'en_AU.ISO8859-1', - 'en_be': 'en_BE.ISO8859-1', - 'en_be@euro': 'en_BE.ISO8859-15', - 'en_bw': 'en_BW.ISO8859-1', - 'en_bw.iso88591': 'en_BW.ISO8859-1', - 'en_ca': 'en_CA.ISO8859-1', - 'en_ca.iso88591': 'en_CA.ISO8859-1', - 'en_gb': 'en_GB.ISO8859-1', - 'en_gb.88591': 'en_GB.ISO8859-1', - 'en_gb.iso88591': 'en_GB.ISO8859-1', - 'en_gb.iso885915': 'en_GB.ISO8859-15', - 'en_gb@euro': 'en_GB.ISO8859-15', - 'en_hk': 'en_HK.ISO8859-1', - 'en_hk.iso88591': 'en_HK.ISO8859-1', - 'en_ie': 'en_IE.ISO8859-1', - 'en_ie.iso88591': 'en_IE.ISO8859-1', - 'en_ie.iso885915': 'en_IE.ISO8859-15', - 'en_ie.iso885915@euro': 'en_IE.ISO8859-15', - 'en_ie.utf8@euro': 'en_IE.UTF-8', - 'en_ie@euro': 'en_IE.ISO8859-15', - 'en_in': 'en_IN.ISO8859-1', - 'en_nz': 'en_NZ.ISO8859-1', - 'en_nz.iso88591': 'en_NZ.ISO8859-1', - 'en_ph': 'en_PH.ISO8859-1', - 'en_ph.iso88591': 'en_PH.ISO8859-1', - 'en_sg': 'en_SG.ISO8859-1', - 'en_sg.iso88591': 'en_SG.ISO8859-1', - 'en_uk': 'en_GB.ISO8859-1', - 'en_us': 'en_US.ISO8859-1', - 'en_us.88591': 'en_US.ISO8859-1', - 'en_us.885915': 'en_US.ISO8859-15', - 'en_us.iso88591': 'en_US.ISO8859-1', - 'en_us.iso885915': 'en_US.ISO8859-15', - 'en_us.iso885915@euro': 'en_US.ISO8859-15', - 'en_us@euro': 'en_US.ISO8859-15', - 'en_us@euro@euro': 'en_US.ISO8859-15', - 'en_za': 'en_ZA.ISO8859-1', - 'en_za.88591': 'en_ZA.ISO8859-1', - 'en_za.iso88591': 'en_ZA.ISO8859-1', - 'en_za.iso885915': 'en_ZA.ISO8859-15', - 'en_za@euro': 'en_ZA.ISO8859-15', - 'en_zw': 'en_ZW.ISO8859-1', - 'en_zw.iso88591': 'en_ZW.ISO8859-1', - 'eng_gb': 'en_GB.ISO8859-1', - 'eng_gb.8859': 'en_GB.ISO8859-1', - 'english': 'en_EN.ISO8859-1', - 'english.iso88591': 'en_EN.ISO8859-1', - 'english_uk': 'en_GB.ISO8859-1', - 'english_uk.8859': 'en_GB.ISO8859-1', - 'english_united-states': 'en_US.ISO8859-1', - 'english_united-states.437': 'C', - 'english_us': 'en_US.ISO8859-1', - 'english_us.8859': 'en_US.ISO8859-1', - 'english_us.ascii': 'en_US.ISO8859-1', - 'eo': 'eo_XX.ISO8859-3', - 'eo_eo': 'eo_EO.ISO8859-3', - 'eo_eo.iso88593': 'eo_EO.ISO8859-3', - 'eo_xx': 'eo_XX.ISO8859-3', - 'eo_xx.iso88593': 'eo_XX.ISO8859-3', - 'es': 'es_ES.ISO8859-1', - 'es_ar': 'es_AR.ISO8859-1', - 'es_ar.iso88591': 'es_AR.ISO8859-1', - 'es_bo': 'es_BO.ISO8859-1', - 'es_bo.iso88591': 'es_BO.ISO8859-1', - 'es_cl': 'es_CL.ISO8859-1', - 'es_cl.iso88591': 'es_CL.ISO8859-1', - 'es_co': 'es_CO.ISO8859-1', - 'es_co.iso88591': 'es_CO.ISO8859-1', - 'es_cr': 'es_CR.ISO8859-1', - 'es_cr.iso88591': 'es_CR.ISO8859-1', - 'es_do': 'es_DO.ISO8859-1', - 'es_do.iso88591': 'es_DO.ISO8859-1', - 'es_ec': 'es_EC.ISO8859-1', - 'es_ec.iso88591': 'es_EC.ISO8859-1', - 'es_es': 'es_ES.ISO8859-1', - 'es_es.88591': 'es_ES.ISO8859-1', - 'es_es.iso88591': 'es_ES.ISO8859-1', - 'es_es.iso885915': 'es_ES.ISO8859-15', - 'es_es.iso885915@euro': 'es_ES.ISO8859-15', - 'es_es.utf8@euro': 'es_ES.UTF-8', - 'es_es@euro': 'es_ES.ISO8859-15', - 'es_gt': 'es_GT.ISO8859-1', - 'es_gt.iso88591': 'es_GT.ISO8859-1', - 'es_hn': 'es_HN.ISO8859-1', - 'es_hn.iso88591': 'es_HN.ISO8859-1', - 'es_mx': 'es_MX.ISO8859-1', - 'es_mx.iso88591': 'es_MX.ISO8859-1', - 'es_ni': 'es_NI.ISO8859-1', - 'es_ni.iso88591': 'es_NI.ISO8859-1', - 'es_pa': 'es_PA.ISO8859-1', - 'es_pa.iso88591': 'es_PA.ISO8859-1', - 'es_pa.iso885915': 'es_PA.ISO8859-15', - 'es_pa@euro': 'es_PA.ISO8859-15', - 'es_pe': 'es_PE.ISO8859-1', - 'es_pe.iso88591': 'es_PE.ISO8859-1', - 'es_pe.iso885915': 'es_PE.ISO8859-15', - 'es_pe@euro': 'es_PE.ISO8859-15', - 'es_pr': 'es_PR.ISO8859-1', - 'es_pr.iso88591': 'es_PR.ISO8859-1', - 'es_py': 'es_PY.ISO8859-1', - 'es_py.iso88591': 'es_PY.ISO8859-1', - 'es_py.iso885915': 'es_PY.ISO8859-15', - 'es_py@euro': 'es_PY.ISO8859-15', - 'es_sv': 'es_SV.ISO8859-1', - 'es_sv.iso88591': 'es_SV.ISO8859-1', - 'es_sv.iso885915': 'es_SV.ISO8859-15', - 'es_sv@euro': 'es_SV.ISO8859-15', - 'es_us': 'es_US.ISO8859-1', - 'es_us.iso88591': 'es_US.ISO8859-1', - 'es_uy': 'es_UY.ISO8859-1', - 'es_uy.iso88591': 'es_UY.ISO8859-1', - 'es_uy.iso885915': 'es_UY.ISO8859-15', - 'es_uy@euro': 'es_UY.ISO8859-15', - 'es_ve': 'es_VE.ISO8859-1', - 'es_ve.iso88591': 'es_VE.ISO8859-1', - 'es_ve.iso885915': 'es_VE.ISO8859-15', - 'es_ve@euro': 'es_VE.ISO8859-15', - 'estonian': 'et_EE.ISO8859-1', - 'et': 'et_EE.ISO8859-15', - 'et_ee': 'et_EE.ISO8859-15', - 'et_ee.iso88591': 'et_EE.ISO8859-1', - 'et_ee.iso885913': 'et_EE.ISO8859-13', - 'et_ee.iso885915': 'et_EE.ISO8859-15', - 'et_ee.iso88594': 'et_EE.ISO8859-4', - 'et_ee@euro': 'et_EE.ISO8859-15', - 'eu': 'eu_ES.ISO8859-1', - 'eu_es': 'eu_ES.ISO8859-1', - 'eu_es.iso88591': 'eu_ES.ISO8859-1', - 'eu_es.iso885915': 'eu_ES.ISO8859-15', - 'eu_es.iso885915@euro': 'eu_ES.ISO8859-15', - 'eu_es.utf8@euro': 'eu_ES.UTF-8', - 'eu_es@euro': 'eu_ES.ISO8859-15', - 'fa': 'fa_IR.UTF-8', - 'fa_ir': 'fa_IR.UTF-8', - 'fa_ir.isiri3342': 'fa_IR.ISIRI-3342', - 'fi': 'fi_FI.ISO8859-15', - 'fi.iso885915': 'fi_FI.ISO8859-15', - 'fi_fi': 'fi_FI.ISO8859-15', - 'fi_fi.88591': 'fi_FI.ISO8859-1', - 'fi_fi.iso88591': 'fi_FI.ISO8859-1', - 'fi_fi.iso885915': 'fi_FI.ISO8859-15', - 'fi_fi.iso885915@euro': 'fi_FI.ISO8859-15', - 'fi_fi.utf8@euro': 'fi_FI.UTF-8', - 'fi_fi@euro': 'fi_FI.ISO8859-15', - 'finnish': 'fi_FI.ISO8859-1', - 'finnish.iso88591': 'fi_FI.ISO8859-1', - 'fo': 'fo_FO.ISO8859-1', - 'fo_fo': 'fo_FO.ISO8859-1', - 'fo_fo.iso88591': 'fo_FO.ISO8859-1', - 'fo_fo.iso885915': 'fo_FO.ISO8859-15', - 'fo_fo@euro': 'fo_FO.ISO8859-15', - 'fr': 'fr_FR.ISO8859-1', - 'fr.iso885915': 'fr_FR.ISO8859-15', - 'fr_be': 'fr_BE.ISO8859-1', - 'fr_be.88591': 'fr_BE.ISO8859-1', - 'fr_be.iso88591': 'fr_BE.ISO8859-1', - 'fr_be.iso885915': 'fr_BE.ISO8859-15', - 'fr_be.iso885915@euro': 'fr_BE.ISO8859-15', - 'fr_be.utf8@euro': 'fr_BE.UTF-8', - 'fr_be@euro': 'fr_BE.ISO8859-15', - 'fr_ca': 'fr_CA.ISO8859-1', - 'fr_ca.88591': 'fr_CA.ISO8859-1', - 'fr_ca.iso88591': 'fr_CA.ISO8859-1', - 'fr_ca.iso885915': 'fr_CA.ISO8859-15', - 'fr_ca@euro': 'fr_CA.ISO8859-15', - 'fr_ch': 'fr_CH.ISO8859-1', - 'fr_ch.88591': 'fr_CH.ISO8859-1', - 'fr_ch.iso88591': 'fr_CH.ISO8859-1', - 'fr_ch.iso885915': 'fr_CH.ISO8859-15', - 'fr_ch@euro': 'fr_CH.ISO8859-15', - 'fr_fr': 'fr_FR.ISO8859-1', - 'fr_fr.88591': 'fr_FR.ISO8859-1', - 'fr_fr.iso88591': 'fr_FR.ISO8859-1', - 'fr_fr.iso885915': 'fr_FR.ISO8859-15', - 'fr_fr.iso885915@euro': 'fr_FR.ISO8859-15', - 'fr_fr.utf8@euro': 'fr_FR.UTF-8', - 'fr_fr@euro': 'fr_FR.ISO8859-15', - 'fr_lu': 'fr_LU.ISO8859-1', - 'fr_lu.88591': 'fr_LU.ISO8859-1', - 'fr_lu.iso88591': 'fr_LU.ISO8859-1', - 'fr_lu.iso885915': 'fr_LU.ISO8859-15', - 'fr_lu.iso885915@euro': 'fr_LU.ISO8859-15', - 'fr_lu.utf8@euro': 'fr_LU.UTF-8', - 'fr_lu@euro': 'fr_LU.ISO8859-15', - 'fran\xe7ais': 'fr_FR.ISO8859-1', - 'fre_fr': 'fr_FR.ISO8859-1', - 'fre_fr.8859': 'fr_FR.ISO8859-1', - 'french': 'fr_FR.ISO8859-1', - 'french.iso88591': 'fr_CH.ISO8859-1', - 'french_france': 'fr_FR.ISO8859-1', - 'french_france.8859': 'fr_FR.ISO8859-1', - 'ga': 'ga_IE.ISO8859-1', - 'ga_ie': 'ga_IE.ISO8859-1', - 'ga_ie.iso88591': 'ga_IE.ISO8859-1', - 'ga_ie.iso885914': 'ga_IE.ISO8859-14', - 'ga_ie.iso885915': 'ga_IE.ISO8859-15', - 'ga_ie.iso885915@euro': 'ga_IE.ISO8859-15', - 'ga_ie.utf8@euro': 'ga_IE.UTF-8', - 'ga_ie@euro': 'ga_IE.ISO8859-15', - 'galego': 'gl_ES.ISO8859-1', - 'galician': 'gl_ES.ISO8859-1', - 'gd': 'gd_GB.ISO8859-1', - 'gd_gb': 'gd_GB.ISO8859-1', - 'gd_gb.iso88591': 'gd_GB.ISO8859-1', - 'gd_gb.iso885914': 'gd_GB.ISO8859-14', - 'gd_gb.iso885915': 'gd_GB.ISO8859-15', - 'gd_gb@euro': 'gd_GB.ISO8859-15', - 'ger_de': 'de_DE.ISO8859-1', - 'ger_de.8859': 'de_DE.ISO8859-1', - 'german': 'de_DE.ISO8859-1', - 'german.iso88591': 'de_CH.ISO8859-1', - 'german_germany': 'de_DE.ISO8859-1', - 'german_germany.8859': 'de_DE.ISO8859-1', - 'gl': 'gl_ES.ISO8859-1', - 'gl_es': 'gl_ES.ISO8859-1', - 'gl_es.iso88591': 'gl_ES.ISO8859-1', - 'gl_es.iso885915': 'gl_ES.ISO8859-15', - 'gl_es.iso885915@euro': 'gl_ES.ISO8859-15', - 'gl_es.utf8@euro': 'gl_ES.UTF-8', - 'gl_es@euro': 'gl_ES.ISO8859-15', - 'greek': 'el_GR.ISO8859-7', - 'greek.iso88597': 'el_GR.ISO8859-7', - 'gu_in': 'gu_IN.UTF-8', - 'gv': 'gv_GB.ISO8859-1', - 'gv_gb': 'gv_GB.ISO8859-1', - 'gv_gb.iso88591': 'gv_GB.ISO8859-1', - 'gv_gb.iso885914': 'gv_GB.ISO8859-14', - 'gv_gb.iso885915': 'gv_GB.ISO8859-15', - 'gv_gb@euro': 'gv_GB.ISO8859-15', - 'he': 'he_IL.ISO8859-8', - 'he_il': 'he_IL.ISO8859-8', - 'he_il.cp1255': 'he_IL.CP1255', - 'he_il.iso88598': 'he_IL.ISO8859-8', - 'he_il.microsoftcp1255': 'he_IL.CP1255', - 'hebrew': 'iw_IL.ISO8859-8', - 'hebrew.iso88598': 'iw_IL.ISO8859-8', - 'hi': 'hi_IN.ISCII-DEV', - 'hi_in': 'hi_IN.ISCII-DEV', - 'hi_in.isciidev': 'hi_IN.ISCII-DEV', - 'hne': 'hne_IN.UTF-8', - 'hr': 'hr_HR.ISO8859-2', - 'hr_hr': 'hr_HR.ISO8859-2', - 'hr_hr.iso88592': 'hr_HR.ISO8859-2', - 'hrvatski': 'hr_HR.ISO8859-2', - 'hu': 'hu_HU.ISO8859-2', - 'hu_hu': 'hu_HU.ISO8859-2', - 'hu_hu.iso88592': 'hu_HU.ISO8859-2', - 'hungarian': 'hu_HU.ISO8859-2', - 'icelandic': 'is_IS.ISO8859-1', - 'icelandic.iso88591': 'is_IS.ISO8859-1', - 'id': 'id_ID.ISO8859-1', - 'id_id': 'id_ID.ISO8859-1', - 'in': 'id_ID.ISO8859-1', - 'in_id': 'id_ID.ISO8859-1', - 'is': 'is_IS.ISO8859-1', - 'is_is': 'is_IS.ISO8859-1', - 'is_is.iso88591': 'is_IS.ISO8859-1', - 'is_is.iso885915': 'is_IS.ISO8859-15', - 'is_is@euro': 'is_IS.ISO8859-15', - 'iso-8859-1': 'en_US.ISO8859-1', - 'iso-8859-15': 'en_US.ISO8859-15', - 'iso8859-1': 'en_US.ISO8859-1', - 'iso8859-15': 'en_US.ISO8859-15', - 'iso_8859_1': 'en_US.ISO8859-1', - 'iso_8859_15': 'en_US.ISO8859-15', - 'it': 'it_IT.ISO8859-1', - 'it.iso885915': 'it_IT.ISO8859-15', - 'it_ch': 'it_CH.ISO8859-1', - 'it_ch.iso88591': 'it_CH.ISO8859-1', - 'it_ch.iso885915': 'it_CH.ISO8859-15', - 'it_ch@euro': 'it_CH.ISO8859-15', - 'it_it': 'it_IT.ISO8859-1', - 'it_it.88591': 'it_IT.ISO8859-1', - 'it_it.iso88591': 'it_IT.ISO8859-1', - 'it_it.iso885915': 'it_IT.ISO8859-15', - 'it_it.iso885915@euro': 'it_IT.ISO8859-15', - 'it_it.utf8@euro': 'it_IT.UTF-8', - 'it_it@euro': 'it_IT.ISO8859-15', - 'italian': 'it_IT.ISO8859-1', - 'italian.iso88591': 'it_IT.ISO8859-1', - 'iu': 'iu_CA.NUNACOM-8', - 'iu_ca': 'iu_CA.NUNACOM-8', - 'iu_ca.nunacom8': 'iu_CA.NUNACOM-8', - 'iw': 'he_IL.ISO8859-8', - 'iw_il': 'he_IL.ISO8859-8', - 'iw_il.iso88598': 'he_IL.ISO8859-8', - 'ja': 'ja_JP.eucJP', - 'ja.jis': 'ja_JP.JIS7', - 'ja.sjis': 'ja_JP.SJIS', - 'ja_jp': 'ja_JP.eucJP', - 'ja_jp.ajec': 'ja_JP.eucJP', - 'ja_jp.euc': 'ja_JP.eucJP', - 'ja_jp.eucjp': 'ja_JP.eucJP', - 'ja_jp.iso-2022-jp': 'ja_JP.JIS7', - 'ja_jp.iso2022jp': 'ja_JP.JIS7', - 'ja_jp.jis': 'ja_JP.JIS7', - 'ja_jp.jis7': 'ja_JP.JIS7', - 'ja_jp.mscode': 'ja_JP.SJIS', - 'ja_jp.pck': 'ja_JP.SJIS', - 'ja_jp.sjis': 'ja_JP.SJIS', - 'ja_jp.ujis': 'ja_JP.eucJP', - 'japan': 'ja_JP.eucJP', - 'japanese': 'ja_JP.eucJP', - 'japanese-euc': 'ja_JP.eucJP', - 'japanese.euc': 'ja_JP.eucJP', - 'japanese.sjis': 'ja_JP.SJIS', - 'jp_jp': 'ja_JP.eucJP', - 'ka': 'ka_GE.GEORGIAN-ACADEMY', - 'ka_ge': 'ka_GE.GEORGIAN-ACADEMY', - 'ka_ge.georgianacademy': 'ka_GE.GEORGIAN-ACADEMY', - 'ka_ge.georgianps': 'ka_GE.GEORGIAN-PS', - 'ka_ge.georgianrs': 'ka_GE.GEORGIAN-ACADEMY', - 'kl': 'kl_GL.ISO8859-1', - 'kl_gl': 'kl_GL.ISO8859-1', - 'kl_gl.iso88591': 'kl_GL.ISO8859-1', - 'kl_gl.iso885915': 'kl_GL.ISO8859-15', - 'kl_gl@euro': 'kl_GL.ISO8859-15', - 'km_kh': 'km_KH.UTF-8', - 'kn': 'kn_IN.UTF-8', - 'kn_in': 'kn_IN.UTF-8', - 'ko': 'ko_KR.eucKR', - 'ko_kr': 'ko_KR.eucKR', - 'ko_kr.euc': 'ko_KR.eucKR', - 'ko_kr.euckr': 'ko_KR.eucKR', - 'korean': 'ko_KR.eucKR', - 'korean.euc': 'ko_KR.eucKR', - 'ks': 'ks_IN.UTF-8', - 'ks_in@devanagari': 'ks_IN@devanagari.UTF-8', - 'kw': 'kw_GB.ISO8859-1', - 'kw_gb': 'kw_GB.ISO8859-1', - 'kw_gb.iso88591': 'kw_GB.ISO8859-1', - 'kw_gb.iso885914': 'kw_GB.ISO8859-14', - 'kw_gb.iso885915': 'kw_GB.ISO8859-15', - 'kw_gb@euro': 'kw_GB.ISO8859-15', - 'ky': 'ky_KG.UTF-8', - 'ky_kg': 'ky_KG.UTF-8', - 'lithuanian': 'lt_LT.ISO8859-13', - 'lo': 'lo_LA.MULELAO-1', - 'lo_la': 'lo_LA.MULELAO-1', - 'lo_la.cp1133': 'lo_LA.IBM-CP1133', - 'lo_la.ibmcp1133': 'lo_LA.IBM-CP1133', - 'lo_la.mulelao1': 'lo_LA.MULELAO-1', - 'lt': 'lt_LT.ISO8859-13', - 'lt_lt': 'lt_LT.ISO8859-13', - 'lt_lt.iso885913': 'lt_LT.ISO8859-13', - 'lt_lt.iso88594': 'lt_LT.ISO8859-4', - 'lv': 'lv_LV.ISO8859-13', - 'lv_lv': 'lv_LV.ISO8859-13', - 'lv_lv.iso885913': 'lv_LV.ISO8859-13', - 'lv_lv.iso88594': 'lv_LV.ISO8859-4', - 'mai': 'mai_IN.UTF-8', - 'mi': 'mi_NZ.ISO8859-1', - 'mi_nz': 'mi_NZ.ISO8859-1', - 'mi_nz.iso88591': 'mi_NZ.ISO8859-1', - 'mk': 'mk_MK.ISO8859-5', - 'mk_mk': 'mk_MK.ISO8859-5', - 'mk_mk.cp1251': 'mk_MK.CP1251', - 'mk_mk.iso88595': 'mk_MK.ISO8859-5', - 'mk_mk.microsoftcp1251': 'mk_MK.CP1251', - 'ml': 'ml_IN.UTF-8', - 'mr': 'mr_IN.UTF-8', - 'mr_in': 'mr_IN.UTF-8', - 'ms': 'ms_MY.ISO8859-1', - 'ms_my': 'ms_MY.ISO8859-1', - 'ms_my.iso88591': 'ms_MY.ISO8859-1', - 'mt': 'mt_MT.ISO8859-3', - 'mt_mt': 'mt_MT.ISO8859-3', - 'mt_mt.iso88593': 'mt_MT.ISO8859-3', - 'nb': 'nb_NO.ISO8859-1', - 'nb_no': 'nb_NO.ISO8859-1', - 'nb_no.88591': 'nb_NO.ISO8859-1', - 'nb_no.iso88591': 'nb_NO.ISO8859-1', - 'nb_no.iso885915': 'nb_NO.ISO8859-15', - 'nb_no@euro': 'nb_NO.ISO8859-15', - 'nl': 'nl_NL.ISO8859-1', - 'nl.iso885915': 'nl_NL.ISO8859-15', - 'nl_be': 'nl_BE.ISO8859-1', - 'nl_be.88591': 'nl_BE.ISO8859-1', - 'nl_be.iso88591': 'nl_BE.ISO8859-1', - 'nl_be.iso885915': 'nl_BE.ISO8859-15', - 'nl_be.iso885915@euro': 'nl_BE.ISO8859-15', - 'nl_be.utf8@euro': 'nl_BE.UTF-8', - 'nl_be@euro': 'nl_BE.ISO8859-15', - 'nl_nl': 'nl_NL.ISO8859-1', - 'nl_nl.88591': 'nl_NL.ISO8859-1', - 'nl_nl.iso88591': 'nl_NL.ISO8859-1', - 'nl_nl.iso885915': 'nl_NL.ISO8859-15', - 'nl_nl.iso885915@euro': 'nl_NL.ISO8859-15', - 'nl_nl.utf8@euro': 'nl_NL.UTF-8', - 'nl_nl@euro': 'nl_NL.ISO8859-15', - 'nn': 'nn_NO.ISO8859-1', - 'nn_no': 'nn_NO.ISO8859-1', - 'nn_no.88591': 'nn_NO.ISO8859-1', - 'nn_no.iso88591': 'nn_NO.ISO8859-1', - 'nn_no.iso885915': 'nn_NO.ISO8859-15', - 'nn_no@euro': 'nn_NO.ISO8859-15', - 'no': 'no_NO.ISO8859-1', - 'no@nynorsk': 'ny_NO.ISO8859-1', - 'no_no': 'no_NO.ISO8859-1', - 'no_no.88591': 'no_NO.ISO8859-1', - 'no_no.iso88591': 'no_NO.ISO8859-1', - 'no_no.iso885915': 'no_NO.ISO8859-15', - 'no_no.iso88591@bokmal': 'no_NO.ISO8859-1', - 'no_no.iso88591@nynorsk': 'no_NO.ISO8859-1', - 'no_no@euro': 'no_NO.ISO8859-15', - 'norwegian': 'no_NO.ISO8859-1', - 'norwegian.iso88591': 'no_NO.ISO8859-1', - 'nr': 'nr_ZA.ISO8859-1', - 'nr_za': 'nr_ZA.ISO8859-1', - 'nr_za.iso88591': 'nr_ZA.ISO8859-1', - 'nso': 'nso_ZA.ISO8859-15', - 'nso_za': 'nso_ZA.ISO8859-15', - 'nso_za.iso885915': 'nso_ZA.ISO8859-15', - 'ny': 'ny_NO.ISO8859-1', - 'ny_no': 'ny_NO.ISO8859-1', - 'ny_no.88591': 'ny_NO.ISO8859-1', - 'ny_no.iso88591': 'ny_NO.ISO8859-1', - 'ny_no.iso885915': 'ny_NO.ISO8859-15', - 'ny_no@euro': 'ny_NO.ISO8859-15', - 'nynorsk': 'nn_NO.ISO8859-1', - 'oc': 'oc_FR.ISO8859-1', - 'oc_fr': 'oc_FR.ISO8859-1', - 'oc_fr.iso88591': 'oc_FR.ISO8859-1', - 'oc_fr.iso885915': 'oc_FR.ISO8859-15', - 'oc_fr@euro': 'oc_FR.ISO8859-15', - 'or': 'or_IN.UTF-8', - 'pa': 'pa_IN.UTF-8', - 'pa_in': 'pa_IN.UTF-8', - 'pd': 'pd_US.ISO8859-1', - 'pd_de': 'pd_DE.ISO8859-1', - 'pd_de.iso88591': 'pd_DE.ISO8859-1', - 'pd_de.iso885915': 'pd_DE.ISO8859-15', - 'pd_de@euro': 'pd_DE.ISO8859-15', - 'pd_us': 'pd_US.ISO8859-1', - 'pd_us.iso88591': 'pd_US.ISO8859-1', - 'pd_us.iso885915': 'pd_US.ISO8859-15', - 'pd_us@euro': 'pd_US.ISO8859-15', - 'ph': 'ph_PH.ISO8859-1', - 'ph_ph': 'ph_PH.ISO8859-1', - 'ph_ph.iso88591': 'ph_PH.ISO8859-1', - 'pl': 'pl_PL.ISO8859-2', - 'pl_pl': 'pl_PL.ISO8859-2', - 'pl_pl.iso88592': 'pl_PL.ISO8859-2', - 'polish': 'pl_PL.ISO8859-2', - 'portuguese': 'pt_PT.ISO8859-1', - 'portuguese.iso88591': 'pt_PT.ISO8859-1', - 'portuguese_brazil': 'pt_BR.ISO8859-1', - 'portuguese_brazil.8859': 'pt_BR.ISO8859-1', - 'posix': 'C', - 'posix-utf2': 'C', - 'pp': 'pp_AN.ISO8859-1', - 'pp_an': 'pp_AN.ISO8859-1', - 'pp_an.iso88591': 'pp_AN.ISO8859-1', - 'pt': 'pt_PT.ISO8859-1', - 'pt.iso885915': 'pt_PT.ISO8859-15', - 'pt_br': 'pt_BR.ISO8859-1', - 'pt_br.88591': 'pt_BR.ISO8859-1', - 'pt_br.iso88591': 'pt_BR.ISO8859-1', - 'pt_br.iso885915': 'pt_BR.ISO8859-15', - 'pt_br@euro': 'pt_BR.ISO8859-15', - 'pt_pt': 'pt_PT.ISO8859-1', - 'pt_pt.88591': 'pt_PT.ISO8859-1', - 'pt_pt.iso88591': 'pt_PT.ISO8859-1', - 'pt_pt.iso885915': 'pt_PT.ISO8859-15', - 'pt_pt.iso885915@euro': 'pt_PT.ISO8859-15', - 'pt_pt.utf8@euro': 'pt_PT.UTF-8', - 'pt_pt@euro': 'pt_PT.ISO8859-15', - 'ro': 'ro_RO.ISO8859-2', - 'ro_ro': 'ro_RO.ISO8859-2', - 'ro_ro.iso88592': 'ro_RO.ISO8859-2', - 'romanian': 'ro_RO.ISO8859-2', - 'ru': 'ru_RU.UTF-8', - 'ru.koi8r': 'ru_RU.KOI8-R', - 'ru_ru': 'ru_RU.UTF-8', - 'ru_ru.cp1251': 'ru_RU.CP1251', - 'ru_ru.iso88595': 'ru_RU.ISO8859-5', - 'ru_ru.koi8r': 'ru_RU.KOI8-R', - 'ru_ru.microsoftcp1251': 'ru_RU.CP1251', - 'ru_ua': 'ru_UA.KOI8-U', - 'ru_ua.cp1251': 'ru_UA.CP1251', - 'ru_ua.koi8u': 'ru_UA.KOI8-U', - 'ru_ua.microsoftcp1251': 'ru_UA.CP1251', - 'rumanian': 'ro_RO.ISO8859-2', - 'russian': 'ru_RU.ISO8859-5', - 'rw': 'rw_RW.ISO8859-1', - 'rw_rw': 'rw_RW.ISO8859-1', - 'rw_rw.iso88591': 'rw_RW.ISO8859-1', - 'sd': 'sd_IN@devanagari.UTF-8', - 'se_no': 'se_NO.UTF-8', - 'serbocroatian': 'sr_RS.UTF-8@latin', - 'sh': 'sr_RS.UTF-8@latin', - 'sh_ba.iso88592@bosnia': 'sr_CS.ISO8859-2', - 'sh_hr': 'sh_HR.ISO8859-2', - 'sh_hr.iso88592': 'hr_HR.ISO8859-2', - 'sh_sp': 'sr_CS.ISO8859-2', - 'sh_yu': 'sr_RS.UTF-8@latin', - 'si': 'si_LK.UTF-8', - 'si_lk': 'si_LK.UTF-8', - 'sinhala': 'si_LK.UTF-8', - 'sk': 'sk_SK.ISO8859-2', - 'sk_sk': 'sk_SK.ISO8859-2', - 'sk_sk.iso88592': 'sk_SK.ISO8859-2', - 'sl': 'sl_SI.ISO8859-2', - 'sl_cs': 'sl_CS.ISO8859-2', - 'sl_si': 'sl_SI.ISO8859-2', - 'sl_si.iso88592': 'sl_SI.ISO8859-2', - 'slovak': 'sk_SK.ISO8859-2', - 'slovene': 'sl_SI.ISO8859-2', - 'slovenian': 'sl_SI.ISO8859-2', - 'sp': 'sr_CS.ISO8859-5', - 'sp_yu': 'sr_CS.ISO8859-5', - 'spanish': 'es_ES.ISO8859-1', - 'spanish.iso88591': 'es_ES.ISO8859-1', - 'spanish_spain': 'es_ES.ISO8859-1', - 'spanish_spain.8859': 'es_ES.ISO8859-1', - 'sq': 'sq_AL.ISO8859-2', - 'sq_al': 'sq_AL.ISO8859-2', - 'sq_al.iso88592': 'sq_AL.ISO8859-2', - 'sr': 'sr_RS.UTF-8', - 'sr@cyrillic': 'sr_RS.UTF-8', - 'sr@latin': 'sr_RS.UTF-8@latin', - 'sr@latn': 'sr_RS.UTF-8@latin', - 'sr_cs': 'sr_RS.UTF-8', - 'sr_cs.iso88592': 'sr_CS.ISO8859-2', - 'sr_cs.iso88592@latn': 'sr_CS.ISO8859-2', - 'sr_cs.iso88595': 'sr_CS.ISO8859-5', - 'sr_cs.utf8@latn': 'sr_RS.UTF-8@latin', - 'sr_cs@latn': 'sr_RS.UTF-8@latin', - 'sr_me': 'sr_ME.UTF-8', - 'sr_rs': 'sr_RS.UTF-8', - 'sr_rs.utf8@latn': 'sr_RS.UTF-8@latin', - 'sr_rs@latin': 'sr_RS.UTF-8@latin', - 'sr_rs@latn': 'sr_RS.UTF-8@latin', - 'sr_sp': 'sr_CS.ISO8859-2', - 'sr_yu': 'sr_RS.UTF-8@latin', - 'sr_yu.cp1251@cyrillic': 'sr_CS.CP1251', - 'sr_yu.iso88592': 'sr_CS.ISO8859-2', - 'sr_yu.iso88595': 'sr_CS.ISO8859-5', - 'sr_yu.iso88595@cyrillic': 'sr_CS.ISO8859-5', - 'sr_yu.microsoftcp1251@cyrillic': 'sr_CS.CP1251', - 'sr_yu.utf8@cyrillic': 'sr_RS.UTF-8', - 'sr_yu@cyrillic': 'sr_RS.UTF-8', - 'ss': 'ss_ZA.ISO8859-1', - 'ss_za': 'ss_ZA.ISO8859-1', - 'ss_za.iso88591': 'ss_ZA.ISO8859-1', - 'st': 'st_ZA.ISO8859-1', - 'st_za': 'st_ZA.ISO8859-1', - 'st_za.iso88591': 'st_ZA.ISO8859-1', - 'sv': 'sv_SE.ISO8859-1', - 'sv.iso885915': 'sv_SE.ISO8859-15', - 'sv_fi': 'sv_FI.ISO8859-1', - 'sv_fi.iso88591': 'sv_FI.ISO8859-1', - 'sv_fi.iso885915': 'sv_FI.ISO8859-15', - 'sv_fi.iso885915@euro': 'sv_FI.ISO8859-15', - 'sv_fi.utf8@euro': 'sv_FI.UTF-8', - 'sv_fi@euro': 'sv_FI.ISO8859-15', - 'sv_se': 'sv_SE.ISO8859-1', - 'sv_se.88591': 'sv_SE.ISO8859-1', - 'sv_se.iso88591': 'sv_SE.ISO8859-1', - 'sv_se.iso885915': 'sv_SE.ISO8859-15', - 'sv_se@euro': 'sv_SE.ISO8859-15', - 'swedish': 'sv_SE.ISO8859-1', - 'swedish.iso88591': 'sv_SE.ISO8859-1', - 'ta': 'ta_IN.TSCII-0', - 'ta_in': 'ta_IN.TSCII-0', - 'ta_in.tscii': 'ta_IN.TSCII-0', - 'ta_in.tscii0': 'ta_IN.TSCII-0', - 'te': 'te_IN.UTF-8', - 'tg': 'tg_TJ.KOI8-C', - 'tg_tj': 'tg_TJ.KOI8-C', - 'tg_tj.koi8c': 'tg_TJ.KOI8-C', - 'th': 'th_TH.ISO8859-11', - 'th_th': 'th_TH.ISO8859-11', - 'th_th.iso885911': 'th_TH.ISO8859-11', - 'th_th.tactis': 'th_TH.TIS620', - 'th_th.tis620': 'th_TH.TIS620', - 'thai': 'th_TH.ISO8859-11', - 'tl': 'tl_PH.ISO8859-1', - 'tl_ph': 'tl_PH.ISO8859-1', - 'tl_ph.iso88591': 'tl_PH.ISO8859-1', - 'tn': 'tn_ZA.ISO8859-15', - 'tn_za': 'tn_ZA.ISO8859-15', - 'tn_za.iso885915': 'tn_ZA.ISO8859-15', - 'tr': 'tr_TR.ISO8859-9', - 'tr_tr': 'tr_TR.ISO8859-9', - 'tr_tr.iso88599': 'tr_TR.ISO8859-9', - 'ts': 'ts_ZA.ISO8859-1', - 'ts_za': 'ts_ZA.ISO8859-1', - 'ts_za.iso88591': 'ts_ZA.ISO8859-1', - 'tt': 'tt_RU.TATAR-CYR', - 'tt_ru': 'tt_RU.TATAR-CYR', - 'tt_ru.koi8c': 'tt_RU.KOI8-C', - 'tt_ru.tatarcyr': 'tt_RU.TATAR-CYR', - 'turkish': 'tr_TR.ISO8859-9', - 'turkish.iso88599': 'tr_TR.ISO8859-9', - 'uk': 'uk_UA.KOI8-U', - 'uk_ua': 'uk_UA.KOI8-U', - 'uk_ua.cp1251': 'uk_UA.CP1251', - 'uk_ua.iso88595': 'uk_UA.ISO8859-5', - 'uk_ua.koi8u': 'uk_UA.KOI8-U', - 'uk_ua.microsoftcp1251': 'uk_UA.CP1251', - 'univ': 'en_US.utf', - 'universal': 'en_US.utf', - 'universal.utf8@ucs4': 'en_US.UTF-8', - 'ur': 'ur_PK.CP1256', - 'ur_pk': 'ur_PK.CP1256', - 'ur_pk.cp1256': 'ur_PK.CP1256', - 'ur_pk.microsoftcp1256': 'ur_PK.CP1256', - 'uz': 'uz_UZ.UTF-8', - 'uz_uz': 'uz_UZ.UTF-8', - 'uz_uz.iso88591': 'uz_UZ.ISO8859-1', - 'uz_uz.utf8@cyrillic': 'uz_UZ.UTF-8', - 'uz_uz@cyrillic': 'uz_UZ.UTF-8', - 've': 've_ZA.UTF-8', - 've_za': 've_ZA.UTF-8', - 'vi': 'vi_VN.TCVN', - 'vi_vn': 'vi_VN.TCVN', - 'vi_vn.tcvn': 'vi_VN.TCVN', - 'vi_vn.tcvn5712': 'vi_VN.TCVN', - 'vi_vn.viscii': 'vi_VN.VISCII', - 'vi_vn.viscii111': 'vi_VN.VISCII', - 'wa': 'wa_BE.ISO8859-1', - 'wa_be': 'wa_BE.ISO8859-1', - 'wa_be.iso88591': 'wa_BE.ISO8859-1', - 'wa_be.iso885915': 'wa_BE.ISO8859-15', - 'wa_be.iso885915@euro': 'wa_BE.ISO8859-15', - 'wa_be@euro': 'wa_BE.ISO8859-15', - 'xh': 'xh_ZA.ISO8859-1', - 'xh_za': 'xh_ZA.ISO8859-1', - 'xh_za.iso88591': 'xh_ZA.ISO8859-1', - 'yi': 'yi_US.CP1255', - 'yi_us': 'yi_US.CP1255', - 'yi_us.cp1255': 'yi_US.CP1255', - 'yi_us.microsoftcp1255': 'yi_US.CP1255', - 'zh': 'zh_CN.eucCN', - 'zh_cn': 'zh_CN.gb2312', - 'zh_cn.big5': 'zh_TW.big5', - 'zh_cn.euc': 'zh_CN.eucCN', - 'zh_cn.gb18030': 'zh_CN.gb18030', - 'zh_cn.gb2312': 'zh_CN.gb2312', - 'zh_cn.gbk': 'zh_CN.gbk', - 'zh_hk': 'zh_HK.big5hkscs', - 'zh_hk.big5': 'zh_HK.big5', - 'zh_hk.big5hk': 'zh_HK.big5hkscs', - 'zh_hk.big5hkscs': 'zh_HK.big5hkscs', - 'zh_tw': 'zh_TW.big5', - 'zh_tw.big5': 'zh_TW.big5', - 'zh_tw.euc': 'zh_TW.eucTW', - 'zh_tw.euctw': 'zh_TW.eucTW', - 'zu': 'zu_ZA.ISO8859-1', - 'zu_za': 'zu_ZA.ISO8859-1', - 'zu_za.iso88591': 'zu_ZA.ISO8859-1', -} - -# -# This maps Windows language identifiers to locale strings. -# -# This list has been updated from -# http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/nls_238z.asp -# to include every locale up to Windows Vista. -# -# NOTE: this mapping is incomplete. If your language is missing, please -# submit a bug report to the Python bug tracker at http://bugs.python.org/ -# Make sure you include the missing language identifier and the suggested -# locale code. -# - -windows_locale = { - 0x0436: "af_ZA", # Afrikaans - 0x041c: "sq_AL", # Albanian - 0x0484: "gsw_FR",# Alsatian - France - 0x045e: "am_ET", # Amharic - Ethiopia - 0x0401: "ar_SA", # Arabic - Saudi Arabia - 0x0801: "ar_IQ", # Arabic - Iraq - 0x0c01: "ar_EG", # Arabic - Egypt - 0x1001: "ar_LY", # Arabic - Libya - 0x1401: "ar_DZ", # Arabic - Algeria - 0x1801: "ar_MA", # Arabic - Morocco - 0x1c01: "ar_TN", # Arabic - Tunisia - 0x2001: "ar_OM", # Arabic - Oman - 0x2401: "ar_YE", # Arabic - Yemen - 0x2801: "ar_SY", # Arabic - Syria - 0x2c01: "ar_JO", # Arabic - Jordan - 0x3001: "ar_LB", # Arabic - Lebanon - 0x3401: "ar_KW", # Arabic - Kuwait - 0x3801: "ar_AE", # Arabic - United Arab Emirates - 0x3c01: "ar_BH", # Arabic - Bahrain - 0x4001: "ar_QA", # Arabic - Qatar - 0x042b: "hy_AM", # Armenian - 0x044d: "as_IN", # Assamese - India - 0x042c: "az_AZ", # Azeri - Latin - 0x082c: "az_AZ", # Azeri - Cyrillic - 0x046d: "ba_RU", # Bashkir - 0x042d: "eu_ES", # Basque - Russia - 0x0423: "be_BY", # Belarusian - 0x0445: "bn_IN", # Begali - 0x201a: "bs_BA", # Bosnian - Cyrillic - 0x141a: "bs_BA", # Bosnian - Latin - 0x047e: "br_FR", # Breton - France - 0x0402: "bg_BG", # Bulgarian -# 0x0455: "my_MM", # Burmese - Not supported - 0x0403: "ca_ES", # Catalan - 0x0004: "zh_CHS",# Chinese - Simplified - 0x0404: "zh_TW", # Chinese - Taiwan - 0x0804: "zh_CN", # Chinese - PRC - 0x0c04: "zh_HK", # Chinese - Hong Kong S.A.R. - 0x1004: "zh_SG", # Chinese - Singapore - 0x1404: "zh_MO", # Chinese - Macao S.A.R. - 0x7c04: "zh_CHT",# Chinese - Traditional - 0x0483: "co_FR", # Corsican - France - 0x041a: "hr_HR", # Croatian - 0x101a: "hr_BA", # Croatian - Bosnia - 0x0405: "cs_CZ", # Czech - 0x0406: "da_DK", # Danish - 0x048c: "gbz_AF",# Dari - Afghanistan - 0x0465: "div_MV",# Divehi - Maldives - 0x0413: "nl_NL", # Dutch - The Netherlands - 0x0813: "nl_BE", # Dutch - Belgium - 0x0409: "en_US", # English - United States - 0x0809: "en_GB", # English - United Kingdom - 0x0c09: "en_AU", # English - Australia - 0x1009: "en_CA", # English - Canada - 0x1409: "en_NZ", # English - New Zealand - 0x1809: "en_IE", # English - Ireland - 0x1c09: "en_ZA", # English - South Africa - 0x2009: "en_JA", # English - Jamaica - 0x2409: "en_CB", # English - Carribbean - 0x2809: "en_BZ", # English - Belize - 0x2c09: "en_TT", # English - Trinidad - 0x3009: "en_ZW", # English - Zimbabwe - 0x3409: "en_PH", # English - Philippines - 0x4009: "en_IN", # English - India - 0x4409: "en_MY", # English - Malaysia - 0x4809: "en_IN", # English - Singapore - 0x0425: "et_EE", # Estonian - 0x0438: "fo_FO", # Faroese - 0x0464: "fil_PH",# Filipino - 0x040b: "fi_FI", # Finnish - 0x040c: "fr_FR", # French - France - 0x080c: "fr_BE", # French - Belgium - 0x0c0c: "fr_CA", # French - Canada - 0x100c: "fr_CH", # French - Switzerland - 0x140c: "fr_LU", # French - Luxembourg - 0x180c: "fr_MC", # French - Monaco - 0x0462: "fy_NL", # Frisian - Netherlands - 0x0456: "gl_ES", # Galician - 0x0437: "ka_GE", # Georgian - 0x0407: "de_DE", # German - Germany - 0x0807: "de_CH", # German - Switzerland - 0x0c07: "de_AT", # German - Austria - 0x1007: "de_LU", # German - Luxembourg - 0x1407: "de_LI", # German - Liechtenstein - 0x0408: "el_GR", # Greek - 0x046f: "kl_GL", # Greenlandic - Greenland - 0x0447: "gu_IN", # Gujarati - 0x0468: "ha_NG", # Hausa - Latin - 0x040d: "he_IL", # Hebrew - 0x0439: "hi_IN", # Hindi - 0x040e: "hu_HU", # Hungarian - 0x040f: "is_IS", # Icelandic - 0x0421: "id_ID", # Indonesian - 0x045d: "iu_CA", # Inuktitut - Syllabics - 0x085d: "iu_CA", # Inuktitut - Latin - 0x083c: "ga_IE", # Irish - Ireland - 0x0410: "it_IT", # Italian - Italy - 0x0810: "it_CH", # Italian - Switzerland - 0x0411: "ja_JP", # Japanese - 0x044b: "kn_IN", # Kannada - India - 0x043f: "kk_KZ", # Kazakh - 0x0453: "kh_KH", # Khmer - Cambodia - 0x0486: "qut_GT",# K'iche - Guatemala - 0x0487: "rw_RW", # Kinyarwanda - Rwanda - 0x0457: "kok_IN",# Konkani - 0x0412: "ko_KR", # Korean - 0x0440: "ky_KG", # Kyrgyz - 0x0454: "lo_LA", # Lao - Lao PDR - 0x0426: "lv_LV", # Latvian - 0x0427: "lt_LT", # Lithuanian - 0x082e: "dsb_DE",# Lower Sorbian - Germany - 0x046e: "lb_LU", # Luxembourgish - 0x042f: "mk_MK", # FYROM Macedonian - 0x043e: "ms_MY", # Malay - Malaysia - 0x083e: "ms_BN", # Malay - Brunei Darussalam - 0x044c: "ml_IN", # Malayalam - India - 0x043a: "mt_MT", # Maltese - 0x0481: "mi_NZ", # Maori - 0x047a: "arn_CL",# Mapudungun - 0x044e: "mr_IN", # Marathi - 0x047c: "moh_CA",# Mohawk - Canada - 0x0450: "mn_MN", # Mongolian - Cyrillic - 0x0850: "mn_CN", # Mongolian - PRC - 0x0461: "ne_NP", # Nepali - 0x0414: "nb_NO", # Norwegian - Bokmal - 0x0814: "nn_NO", # Norwegian - Nynorsk - 0x0482: "oc_FR", # Occitan - France - 0x0448: "or_IN", # Oriya - India - 0x0463: "ps_AF", # Pashto - Afghanistan - 0x0429: "fa_IR", # Persian - 0x0415: "pl_PL", # Polish - 0x0416: "pt_BR", # Portuguese - Brazil - 0x0816: "pt_PT", # Portuguese - Portugal - 0x0446: "pa_IN", # Punjabi - 0x046b: "quz_BO",# Quechua (Bolivia) - 0x086b: "quz_EC",# Quechua (Ecuador) - 0x0c6b: "quz_PE",# Quechua (Peru) - 0x0418: "ro_RO", # Romanian - Romania - 0x0417: "rm_CH", # Romansh - 0x0419: "ru_RU", # Russian - 0x243b: "smn_FI",# Sami Finland - 0x103b: "smj_NO",# Sami Norway - 0x143b: "smj_SE",# Sami Sweden - 0x043b: "se_NO", # Sami Northern Norway - 0x083b: "se_SE", # Sami Northern Sweden - 0x0c3b: "se_FI", # Sami Northern Finland - 0x203b: "sms_FI",# Sami Skolt - 0x183b: "sma_NO",# Sami Southern Norway - 0x1c3b: "sma_SE",# Sami Southern Sweden - 0x044f: "sa_IN", # Sanskrit - 0x0c1a: "sr_SP", # Serbian - Cyrillic - 0x1c1a: "sr_BA", # Serbian - Bosnia Cyrillic - 0x081a: "sr_SP", # Serbian - Latin - 0x181a: "sr_BA", # Serbian - Bosnia Latin - 0x045b: "si_LK", # Sinhala - Sri Lanka - 0x046c: "ns_ZA", # Northern Sotho - 0x0432: "tn_ZA", # Setswana - Southern Africa - 0x041b: "sk_SK", # Slovak - 0x0424: "sl_SI", # Slovenian - 0x040a: "es_ES", # Spanish - Spain - 0x080a: "es_MX", # Spanish - Mexico - 0x0c0a: "es_ES", # Spanish - Spain (Modern) - 0x100a: "es_GT", # Spanish - Guatemala - 0x140a: "es_CR", # Spanish - Costa Rica - 0x180a: "es_PA", # Spanish - Panama - 0x1c0a: "es_DO", # Spanish - Dominican Republic - 0x200a: "es_VE", # Spanish - Venezuela - 0x240a: "es_CO", # Spanish - Colombia - 0x280a: "es_PE", # Spanish - Peru - 0x2c0a: "es_AR", # Spanish - Argentina - 0x300a: "es_EC", # Spanish - Ecuador - 0x340a: "es_CL", # Spanish - Chile - 0x380a: "es_UR", # Spanish - Uruguay - 0x3c0a: "es_PY", # Spanish - Paraguay - 0x400a: "es_BO", # Spanish - Bolivia - 0x440a: "es_SV", # Spanish - El Salvador - 0x480a: "es_HN", # Spanish - Honduras - 0x4c0a: "es_NI", # Spanish - Nicaragua - 0x500a: "es_PR", # Spanish - Puerto Rico - 0x540a: "es_US", # Spanish - United States -# 0x0430: "", # Sutu - Not supported - 0x0441: "sw_KE", # Swahili - 0x041d: "sv_SE", # Swedish - Sweden - 0x081d: "sv_FI", # Swedish - Finland - 0x045a: "syr_SY",# Syriac - 0x0428: "tg_TJ", # Tajik - Cyrillic - 0x085f: "tmz_DZ",# Tamazight - Latin - 0x0449: "ta_IN", # Tamil - 0x0444: "tt_RU", # Tatar - 0x044a: "te_IN", # Telugu - 0x041e: "th_TH", # Thai - 0x0851: "bo_BT", # Tibetan - Bhutan - 0x0451: "bo_CN", # Tibetan - PRC - 0x041f: "tr_TR", # Turkish - 0x0442: "tk_TM", # Turkmen - Cyrillic - 0x0480: "ug_CN", # Uighur - Arabic - 0x0422: "uk_UA", # Ukrainian - 0x042e: "wen_DE",# Upper Sorbian - Germany - 0x0420: "ur_PK", # Urdu - 0x0820: "ur_IN", # Urdu - India - 0x0443: "uz_UZ", # Uzbek - Latin - 0x0843: "uz_UZ", # Uzbek - Cyrillic - 0x042a: "vi_VN", # Vietnamese - 0x0452: "cy_GB", # Welsh - 0x0488: "wo_SN", # Wolof - Senegal - 0x0434: "xh_ZA", # Xhosa - South Africa - 0x0485: "sah_RU",# Yakut - Cyrillic - 0x0478: "ii_CN", # Yi - PRC - 0x046a: "yo_NG", # Yoruba - Nigeria - 0x0435: "zu_ZA", # Zulu -} - -def _print_locale(): - - """ Test function. - """ - categories = {} - def _init_categories(categories=categories): - for k,v in globals().items(): - if k[:3] == 'LC_': - categories[k] = v - _init_categories() - del categories['LC_ALL'] - - print 'Locale defaults as determined by getdefaultlocale():' - print '-'*72 - lang, enc = getdefaultlocale() - print 'Language: ', lang or '(undefined)' - print 'Encoding: ', enc or '(undefined)' - print - - print 'Locale settings on startup:' - print '-'*72 - for name,category in categories.items(): - print name, '...' - lang, enc = getlocale(category) - print ' Language: ', lang or '(undefined)' - print ' Encoding: ', enc or '(undefined)' - print - - print - print 'Locale settings after calling resetlocale():' - print '-'*72 - resetlocale() - for name,category in categories.items(): - print name, '...' - lang, enc = getlocale(category) - print ' Language: ', lang or '(undefined)' - print ' Encoding: ', enc or '(undefined)' - print - - try: - setlocale(LC_ALL, "") - except: - print 'NOTE:' - print 'setlocale(LC_ALL, "") does not support the default locale' - print 'given in the OS environment variables.' - else: - print - print 'Locale settings after calling setlocale(LC_ALL, ""):' - print '-'*72 - for name,category in categories.items(): - print name, '...' - lang, enc = getlocale(category) - print ' Language: ', lang or '(undefined)' - print ' Encoding: ', enc or '(undefined)' - print - -### - -try: - LC_MESSAGES -except NameError: - pass -else: - __all__.append("LC_MESSAGES") - -if __name__=='__main__': - print 'Locale aliasing:' - print - _print_locale() - print - print 'Number formatting:' - print - _test() diff --git a/PythonEnv/2.7/Lib/locale.pyc b/PythonEnv/2.7/Lib/locale.pyc deleted file mode 100644 index f717f0dbb9d0e460b853857609e4a0e3f750e08f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51088 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 diff --git a/PythonEnv/2.7/Lib/no-global-site-packages.txt b/PythonEnv/2.7/Lib/no-global-site-packages.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/PythonEnv/2.7/Lib/ntpath.py b/PythonEnv/2.7/Lib/ntpath.py deleted file mode 100644 index 4f8f423c0..000000000 --- a/PythonEnv/2.7/Lib/ntpath.py +++ /dev/null @@ -1,533 +0,0 @@ -# Module 'ntpath' -- common operations on WinNT/Win95 pathnames -"""Common pathname manipulations, WindowsNT/95 version. - -Instead of importing this module directly, import os and refer to this -module as os.path. -""" - -import os -import sys -import stat -import genericpath -import warnings - -from genericpath import * - -__all__ = ["normcase","isabs","join","splitdrive","split","splitext", - "basename","dirname","commonprefix","getsize","getmtime", - "getatime","getctime", "islink","exists","lexists","isdir","isfile", - "ismount","walk","expanduser","expandvars","normpath","abspath", - "splitunc","curdir","pardir","sep","pathsep","defpath","altsep", - "extsep","devnull","realpath","supports_unicode_filenames","relpath"] - -# strings representing various path-related bits and pieces -curdir = '.' -pardir = '..' -extsep = '.' -sep = '\\' -pathsep = ';' -altsep = '/' -defpath = '.;C:\\bin' -if 'ce' in sys.builtin_module_names: - defpath = '\\Windows' -elif 'os2' in sys.builtin_module_names: - # OS/2 w/ VACPP - altsep = '/' -devnull = 'nul' - -# Normalize the case of a pathname and map slashes to backslashes. -# Other normalizations (such as optimizing '../' away) are not done -# (this is done by normpath). - -def normcase(s): - """Normalize case of pathname. - - Makes all characters lowercase and all slashes into backslashes.""" - return s.replace("/", "\\").lower() - - -# Return whether a path is absolute. -# Trivial in Posix, harder on the Mac or MS-DOS. -# For DOS it is absolute if it starts with a slash or backslash (current -# volume), or if a pathname after the volume letter and colon / UNC resource -# starts with a slash or backslash. - -def isabs(s): - """Test whether a path is absolute""" - s = splitdrive(s)[1] - return s != '' and s[:1] in '/\\' - - -# Join two (or more) paths. - -def join(a, *p): - """Join two or more pathname components, inserting "\\" as needed. - If any component is an absolute path, all previous path components - will be discarded.""" - path = a - for b in p: - b_wins = 0 # set to 1 iff b makes path irrelevant - if path == "": - b_wins = 1 - - elif isabs(b): - # This probably wipes out path so far. However, it's more - # complicated if path begins with a drive letter: - # 1. join('c:', '/a') == 'c:/a' - # 2. join('c:/', '/a') == 'c:/a' - # But - # 3. join('c:/a', '/b') == '/b' - # 4. join('c:', 'd:/') = 'd:/' - # 5. join('c:/', 'd:/') = 'd:/' - if path[1:2] != ":" or b[1:2] == ":": - # Path doesn't start with a drive letter, or cases 4 and 5. - b_wins = 1 - - # Else path has a drive letter, and b doesn't but is absolute. - elif len(path) > 3 or (len(path) == 3 and - path[-1] not in "/\\"): - # case 3 - b_wins = 1 - - if b_wins: - path = b - else: - # Join, and ensure there's a separator. - assert len(path) > 0 - if path[-1] in "/\\": - if b and b[0] in "/\\": - path += b[1:] - else: - path += b - elif path[-1] == ":": - path += b - elif b: - if b[0] in "/\\": - path += b - else: - path += "\\" + b - else: - # path is not empty and does not end with a backslash, - # but b is empty; since, e.g., split('a/') produces - # ('a', ''), it's best if join() adds a backslash in - # this case. - path += '\\' - - return path - - -# Split a path in a drive specification (a drive letter followed by a -# colon) and the path specification. -# It is always true that drivespec + pathspec == p -def splitdrive(p): - """Split a pathname into drive and path specifiers. Returns a 2-tuple -"(drive,path)"; either part may be empty""" - if p[1:2] == ':': - return p[0:2], p[2:] - return '', p - - -# Parse UNC paths -def splitunc(p): - """Split a pathname into UNC mount point and relative path specifiers. - - Return a 2-tuple (unc, rest); either part may be empty. - If unc is not empty, it has the form '//host/mount' (or similar - using backslashes). unc+rest is always the input path. - Paths containing drive letters never have an UNC part. - """ - if p[1:2] == ':': - return '', p # Drive letter present - firstTwo = p[0:2] - if firstTwo == '//' or firstTwo == '\\\\': - # is a UNC path: - # vvvvvvvvvvvvvvvvvvvv equivalent to drive letter - # \\machine\mountpoint\directories... - # directory ^^^^^^^^^^^^^^^ - normp = normcase(p) - index = normp.find('\\', 2) - if index == -1: - ##raise RuntimeError, 'illegal UNC path: "' + p + '"' - return ("", p) - index = normp.find('\\', index + 1) - if index == -1: - index = len(p) - return p[:index], p[index:] - return '', p - - -# Split a path in head (everything up to the last '/') and tail (the -# rest). After the trailing '/' is stripped, the invariant -# join(head, tail) == p holds. -# The resulting head won't end in '/' unless it is the root. - -def split(p): - """Split a pathname. - - Return tuple (head, tail) where tail is everything after the final slash. - Either part may be empty.""" - - d, p = splitdrive(p) - # set i to index beyond p's last slash - i = len(p) - while i and p[i-1] not in '/\\': - i = i - 1 - head, tail = p[:i], p[i:] # now tail has no slashes - # remove trailing slashes from head, unless it's all slashes - head2 = head - while head2 and head2[-1] in '/\\': - head2 = head2[:-1] - head = head2 or head - return d + head, tail - - -# Split a path in root and extension. -# The extension is everything starting at the last dot in the last -# pathname component; the root is everything before that. -# It is always true that root + ext == p. - -def splitext(p): - return genericpath._splitext(p, sep, altsep, extsep) -splitext.__doc__ = genericpath._splitext.__doc__ - - -# Return the tail (basename) part of a path. - -def basename(p): - """Returns the final component of a pathname""" - return split(p)[1] - - -# Return the head (dirname) part of a path. - -def dirname(p): - """Returns the directory component of a pathname""" - return split(p)[0] - -# Is a path a symbolic link? -# This will always return false on systems where posix.lstat doesn't exist. - -def islink(path): - """Test for symbolic link. - On WindowsNT/95 and OS/2 always returns false - """ - return False - -# alias exists to lexists -lexists = exists - -# Is a path a mount point? Either a root (with or without drive letter) -# or an UNC path with at most a / or \ after the mount point. - -def ismount(path): - """Test whether a path is a mount point (defined as root of drive)""" - unc, rest = splitunc(path) - if unc: - return rest in ("", "/", "\\") - p = splitdrive(path)[1] - return len(p) == 1 and p[0] in '/\\' - - -# Directory tree walk. -# For each directory under top (including top itself, but excluding -# '.' and '..'), func(arg, dirname, filenames) is called, where -# dirname is the name of the directory and filenames is the list -# of files (and subdirectories etc.) in the directory. -# The func may modify the filenames list, to implement a filter, -# or to impose a different order of visiting. - -def walk(top, func, arg): - """Directory tree walk with callback function. - - For each directory in the directory tree rooted at top (including top - itself, but excluding '.' and '..'), call func(arg, dirname, fnames). - dirname is the name of the directory, and fnames a list of the names of - the files and subdirectories in dirname (excluding '.' and '..'). func - may modify the fnames list in-place (e.g. via del or slice assignment), - and walk will only recurse into the subdirectories whose names remain in - fnames; this can be used to implement a filter, or to impose a specific - order of visiting. No semantics are defined for, or required of, arg, - beyond that arg is always passed to func. It can be used, e.g., to pass - a filename pattern, or a mutable object designed to accumulate - statistics. Passing None for arg is common.""" - warnings.warnpy3k("In 3.x, os.path.walk is removed in favor of os.walk.", - stacklevel=2) - try: - names = os.listdir(top) - except os.error: - return - func(arg, top, names) - for name in names: - name = join(top, name) - if isdir(name): - walk(name, func, arg) - - -# Expand paths beginning with '~' or '~user'. -# '~' means $HOME; '~user' means that user's home directory. -# If the path doesn't begin with '~', or if the user or $HOME is unknown, -# the path is returned unchanged (leaving error reporting to whatever -# function is called with the expanded path as argument). -# See also module 'glob' for expansion of *, ? and [...] in pathnames. -# (A function should also be defined to do full *sh-style environment -# variable expansion.) - -def expanduser(path): - """Expand ~ and ~user constructs. - - If user or $HOME is unknown, do nothing.""" - if path[:1] != '~': - return path - i, n = 1, len(path) - while i < n and path[i] not in '/\\': - i = i + 1 - - if 'HOME' in os.environ: - userhome = os.environ['HOME'] - elif 'USERPROFILE' in os.environ: - userhome = os.environ['USERPROFILE'] - elif not 'HOMEPATH' in os.environ: - return path - else: - try: - drive = os.environ['HOMEDRIVE'] - except KeyError: - drive = '' - userhome = join(drive, os.environ['HOMEPATH']) - - if i != 1: #~user - userhome = join(dirname(userhome), path[1:i]) - - return userhome + path[i:] - - -# Expand paths containing shell variable substitutions. -# The following rules apply: -# - no expansion within single quotes -# - '$$' is translated into '$' -# - '%%' is translated into '%' if '%%' are not seen in %var1%%var2% -# - ${varname} is accepted. -# - $varname is accepted. -# - %varname% is accepted. -# - varnames can be made out of letters, digits and the characters '_-' -# (though is not verified in the ${varname} and %varname% cases) -# XXX With COMMAND.COM you can use any characters in a variable name, -# XXX except '^|<>='. - -def expandvars(path): - """Expand shell variables of the forms $var, ${var} and %var%. - - Unknown variables are left unchanged.""" - if '$' not in path and '%' not in path: - return path - import string - varchars = string.ascii_letters + string.digits + '_-' - res = '' - index = 0 - pathlen = len(path) - while index < pathlen: - c = path[index] - if c == '\'': # no expansion within single quotes - path = path[index + 1:] - pathlen = len(path) - try: - index = path.index('\'') - res = res + '\'' + path[:index + 1] - except ValueError: - res = res + path - index = pathlen - 1 - elif c == '%': # variable or '%' - if path[index + 1:index + 2] == '%': - res = res + c - index = index + 1 - else: - path = path[index+1:] - pathlen = len(path) - try: - index = path.index('%') - except ValueError: - res = res + '%' + path - index = pathlen - 1 - else: - var = path[:index] - if var in os.environ: - res = res + os.environ[var] - else: - res = res + '%' + var + '%' - elif c == '$': # variable or '$$' - if path[index + 1:index + 2] == '$': - res = res + c - index = index + 1 - elif path[index + 1:index + 2] == '{': - path = path[index+2:] - pathlen = len(path) - try: - index = path.index('}') - var = path[:index] - if var in os.environ: - res = res + os.environ[var] - else: - res = res + '${' + var + '}' - except ValueError: - res = res + '${' + path - index = pathlen - 1 - else: - var = '' - index = index + 1 - c = path[index:index + 1] - while c != '' and c in varchars: - var = var + c - index = index + 1 - c = path[index:index + 1] - if var in os.environ: - res = res + os.environ[var] - else: - res = res + '$' + var - if c != '': - index = index - 1 - else: - res = res + c - index = index + 1 - return res - - -# Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A\B. -# Previously, this function also truncated pathnames to 8+3 format, -# but as this module is called "ntpath", that's obviously wrong! - -def normpath(path): - """Normalize path, eliminating double slashes, etc.""" - # Preserve unicode (if path is unicode) - backslash, dot = (u'\\', u'.') if isinstance(path, unicode) else ('\\', '.') - if path.startswith(('\\\\.\\', '\\\\?\\')): - # in the case of paths with these prefixes: - # \\.\ -> device names - # \\?\ -> literal paths - # do not do any normalization, but return the path unchanged - return path - path = path.replace("/", "\\") - prefix, path = splitdrive(path) - # We need to be careful here. If the prefix is empty, and the path starts - # with a backslash, it could either be an absolute path on the current - # drive (\dir1\dir2\file) or a UNC filename (\\server\mount\dir1\file). It - # is therefore imperative NOT to collapse multiple backslashes blindly in - # that case. - # The code below preserves multiple backslashes when there is no drive - # letter. This means that the invalid filename \\\a\b is preserved - # unchanged, where a\\\b is normalised to a\b. It's not clear that there - # is any better behaviour for such edge cases. - if prefix == '': - # No drive letter - preserve initial backslashes - while path[:1] == "\\": - prefix = prefix + backslash - path = path[1:] - else: - # We have a drive letter - collapse initial backslashes - if path.startswith("\\"): - prefix = prefix + backslash - path = path.lstrip("\\") - comps = path.split("\\") - i = 0 - while i < len(comps): - if comps[i] in ('.', ''): - del comps[i] - elif comps[i] == '..': - if i > 0 and comps[i-1] != '..': - del comps[i-1:i+1] - i -= 1 - elif i == 0 and prefix.endswith("\\"): - del comps[i] - else: - i += 1 - else: - i += 1 - # If the path is now empty, substitute '.' - if not prefix and not comps: - comps.append(dot) - return prefix + backslash.join(comps) - - -# Return an absolute path. -try: - from nt import _getfullpathname - -except ImportError: # not running on Windows - mock up something sensible - def abspath(path): - """Return the absolute version of a path.""" - if not isabs(path): - if isinstance(path, unicode): - cwd = os.getcwdu() - else: - cwd = os.getcwd() - path = join(cwd, path) - return normpath(path) - -else: # use native Windows method on Windows - def abspath(path): - """Return the absolute version of a path.""" - - if path: # Empty path must return current working directory. - try: - path = _getfullpathname(path) - except WindowsError: - pass # Bad path - return unchanged. - elif isinstance(path, unicode): - path = os.getcwdu() - else: - path = os.getcwd() - return normpath(path) - -# realpath is a no-op on systems without islink support -realpath = abspath -# Win9x family and earlier have no Unicode filename support. -supports_unicode_filenames = (hasattr(sys, "getwindowsversion") and - sys.getwindowsversion()[3] >= 2) - -def _abspath_split(path): - abs = abspath(normpath(path)) - prefix, rest = splitunc(abs) - is_unc = bool(prefix) - if not is_unc: - prefix, rest = splitdrive(abs) - return is_unc, prefix, [x for x in rest.split(sep) if x] - -def relpath(path, start=curdir): - """Return a relative version of a path""" - - if not path: - raise ValueError("no path specified") - - start_is_unc, start_prefix, start_list = _abspath_split(start) - path_is_unc, path_prefix, path_list = _abspath_split(path) - - if path_is_unc ^ start_is_unc: - raise ValueError("Cannot mix UNC and non-UNC paths (%s and %s)" - % (path, start)) - if path_prefix.lower() != start_prefix.lower(): - if path_is_unc: - raise ValueError("path is on UNC root %s, start on UNC root %s" - % (path_prefix, start_prefix)) - else: - raise ValueError("path is on drive %s, start on drive %s" - % (path_prefix, start_prefix)) - # Work out how much of the filepath is shared by start and path. - i = 0 - for e1, e2 in zip(start_list, path_list): - if e1.lower() != e2.lower(): - break - i += 1 - - rel_list = [pardir] * (len(start_list)-i) + path_list[i:] - if not rel_list: - return curdir - return join(*rel_list) - -try: - # The genericpath.isdir implementation uses os.stat and checks the mode - # attribute to tell whether or not the path is a directory. - # This is overkill on Windows - just pass the path to GetFileAttributes - # and check the attribute from there. - from nt import _isdir as isdir -except ImportError: - # Use genericpath.isdir as imported above. - pass diff --git a/PythonEnv/2.7/Lib/ntpath.pyc b/PythonEnv/2.7/Lib/ntpath.pyc deleted file mode 100644 index 2a68a8268727224375e5a8219184767c9029d34c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12621 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 integer - -Execute file with arguments from args in a subprocess. -If mode == P_NOWAIT return the pid of the process. -If mode == P_WAIT return the process's exit code if it exits normally; -otherwise return -SIG, where SIG is the signal that killed it. """ - return _spawnvef(mode, file, args, None, execv) - - def spawnve(mode, file, args, env): - """spawnve(mode, file, args, env) -> integer - -Execute file with arguments from args in a subprocess with the -specified environment. -If mode == P_NOWAIT return the pid of the process. -If mode == P_WAIT return the process's exit code if it exits normally; -otherwise return -SIG, where SIG is the signal that killed it. """ - return _spawnvef(mode, file, args, env, execve) - - # Note: spawnvp[e] is't currently supported on Windows - - def spawnvp(mode, file, args): - """spawnvp(mode, file, args) -> integer - -Execute file (which is looked for along $PATH) with arguments from -args in a subprocess. -If mode == P_NOWAIT return the pid of the process. -If mode == P_WAIT return the process's exit code if it exits normally; -otherwise return -SIG, where SIG is the signal that killed it. """ - return _spawnvef(mode, file, args, None, execvp) - - def spawnvpe(mode, file, args, env): - """spawnvpe(mode, file, args, env) -> integer - -Execute file (which is looked for along $PATH) with arguments from -args in a subprocess with the supplied environment. -If mode == P_NOWAIT return the pid of the process. -If mode == P_WAIT return the process's exit code if it exits normally; -otherwise return -SIG, where SIG is the signal that killed it. """ - return _spawnvef(mode, file, args, env, execvpe) - -if _exists("spawnv"): - # These aren't supplied by the basic Windows code - # but can be easily implemented in Python - - def spawnl(mode, file, *args): - """spawnl(mode, file, *args) -> integer - -Execute file with arguments from args in a subprocess. -If mode == P_NOWAIT return the pid of the process. -If mode == P_WAIT return the process's exit code if it exits normally; -otherwise return -SIG, where SIG is the signal that killed it. """ - return spawnv(mode, file, args) - - def spawnle(mode, file, *args): - """spawnle(mode, file, *args, env) -> integer - -Execute file with arguments from args in a subprocess with the -supplied environment. -If mode == P_NOWAIT return the pid of the process. -If mode == P_WAIT return the process's exit code if it exits normally; -otherwise return -SIG, where SIG is the signal that killed it. """ - env = args[-1] - return spawnve(mode, file, args[:-1], env) - - - __all__.extend(["spawnv", "spawnve", "spawnl", "spawnle",]) - - -if _exists("spawnvp"): - # At the moment, Windows doesn't implement spawnvp[e], - # so it won't have spawnlp[e] either. - def spawnlp(mode, file, *args): - """spawnlp(mode, file, *args) -> integer - -Execute file (which is looked for along $PATH) with arguments from -args in a subprocess with the supplied environment. -If mode == P_NOWAIT return the pid of the process. -If mode == P_WAIT return the process's exit code if it exits normally; -otherwise return -SIG, where SIG is the signal that killed it. """ - return spawnvp(mode, file, args) - - def spawnlpe(mode, file, *args): - """spawnlpe(mode, file, *args, env) -> integer - -Execute file (which is looked for along $PATH) with arguments from -args in a subprocess with the supplied environment. -If mode == P_NOWAIT return the pid of the process. -If mode == P_WAIT return the process's exit code if it exits normally; -otherwise return -SIG, where SIG is the signal that killed it. """ - env = args[-1] - return spawnvpe(mode, file, args[:-1], env) - - - __all__.extend(["spawnvp", "spawnvpe", "spawnlp", "spawnlpe",]) - - -# Supply popen2 etc. (for Unix) -if _exists("fork"): - if not _exists("popen2"): - def popen2(cmd, mode="t", bufsize=-1): - """Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd' - may be a sequence, in which case arguments will be passed directly to - the program without shell intervention (as with os.spawnv()). If 'cmd' - is a string it will be passed to the shell (as with os.system()). If - 'bufsize' is specified, it sets the buffer size for the I/O pipes. The - file objects (child_stdin, child_stdout) are returned.""" - import warnings - msg = "os.popen2 is deprecated. Use the subprocess module." - warnings.warn(msg, DeprecationWarning, stacklevel=2) - - import subprocess - PIPE = subprocess.PIPE - p = subprocess.Popen(cmd, shell=isinstance(cmd, basestring), - bufsize=bufsize, stdin=PIPE, stdout=PIPE, - close_fds=True) - return p.stdin, p.stdout - __all__.append("popen2") - - if not _exists("popen3"): - def popen3(cmd, mode="t", bufsize=-1): - """Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd' - may be a sequence, in which case arguments will be passed directly to - the program without shell intervention (as with os.spawnv()). If 'cmd' - is a string it will be passed to the shell (as with os.system()). If - 'bufsize' is specified, it sets the buffer size for the I/O pipes. The - file objects (child_stdin, child_stdout, child_stderr) are returned.""" - import warnings - msg = "os.popen3 is deprecated. Use the subprocess module." - warnings.warn(msg, DeprecationWarning, stacklevel=2) - - import subprocess - PIPE = subprocess.PIPE - p = subprocess.Popen(cmd, shell=isinstance(cmd, basestring), - bufsize=bufsize, stdin=PIPE, stdout=PIPE, - stderr=PIPE, close_fds=True) - return p.stdin, p.stdout, p.stderr - __all__.append("popen3") - - if not _exists("popen4"): - def popen4(cmd, mode="t", bufsize=-1): - """Execute the shell command 'cmd' in a sub-process. On UNIX, 'cmd' - may be a sequence, in which case arguments will be passed directly to - the program without shell intervention (as with os.spawnv()). If 'cmd' - is a string it will be passed to the shell (as with os.system()). If - 'bufsize' is specified, it sets the buffer size for the I/O pipes. The - file objects (child_stdin, child_stdout_stderr) are returned.""" - import warnings - msg = "os.popen4 is deprecated. Use the subprocess module." - warnings.warn(msg, DeprecationWarning, stacklevel=2) - - import subprocess - PIPE = subprocess.PIPE - p = subprocess.Popen(cmd, shell=isinstance(cmd, basestring), - bufsize=bufsize, stdin=PIPE, stdout=PIPE, - stderr=subprocess.STDOUT, close_fds=True) - return p.stdin, p.stdout - __all__.append("popen4") - -import copy_reg as _copy_reg - -def _make_stat_result(tup, dict): - return stat_result(tup, dict) - -def _pickle_stat_result(sr): - (type, args) = sr.__reduce__() - return (_make_stat_result, args) - -try: - _copy_reg.pickle(stat_result, _pickle_stat_result, _make_stat_result) -except NameError: # stat_result may not exist - pass - -def _make_statvfs_result(tup, dict): - return statvfs_result(tup, dict) - -def _pickle_statvfs_result(sr): - (type, args) = sr.__reduce__() - return (_make_statvfs_result, args) - -try: - _copy_reg.pickle(statvfs_result, _pickle_statvfs_result, - _make_statvfs_result) -except NameError: # statvfs_result may not exist - pass diff --git a/PythonEnv/2.7/Lib/os.pyc b/PythonEnv/2.7/Lib/os.pyc deleted file mode 100644 index 5de03e6ef5be73c1328c5788dbb1971352f65935..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27518 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 diff --git a/PythonEnv/2.7/Lib/posixpath.py b/PythonEnv/2.7/Lib/posixpath.py deleted file mode 100644 index d65dc757b..000000000 --- a/PythonEnv/2.7/Lib/posixpath.py +++ /dev/null @@ -1,431 +0,0 @@ -"""Common operations on Posix pathnames. - -Instead of importing this module directly, import os and refer to -this module as os.path. The "os.path" name is an alias for this -module on Posix systems; on other systems (e.g. Mac, Windows), -os.path provides the same operations in a manner specific to that -platform, and is an alias to another module (e.g. macpath, ntpath). - -Some of this can actually be useful on non-Posix systems too, e.g. -for manipulation of the pathname component of URLs. -""" - -import os -import sys -import stat -import genericpath -import warnings -from genericpath import * - -try: - _unicode = unicode -except NameError: - # If Python is built without Unicode support, the unicode type - # will not exist. Fake one. - class _unicode(object): - pass - -__all__ = ["normcase","isabs","join","splitdrive","split","splitext", - "basename","dirname","commonprefix","getsize","getmtime", - "getatime","getctime","islink","exists","lexists","isdir","isfile", - "ismount","walk","expanduser","expandvars","normpath","abspath", - "samefile","sameopenfile","samestat", - "curdir","pardir","sep","pathsep","defpath","altsep","extsep", - "devnull","realpath","supports_unicode_filenames","relpath"] - -# strings representing various path-related bits and pieces -curdir = '.' -pardir = '..' -extsep = '.' -sep = '/' -pathsep = ':' -defpath = ':/bin:/usr/bin' -altsep = None -devnull = '/dev/null' - -# Normalize the case of a pathname. Trivial in Posix, string.lower on Mac. -# On MS-DOS this may also turn slashes into backslashes; however, other -# normalizations (such as optimizing '../' away) are not allowed -# (another function should be defined to do that). - -def normcase(s): - """Normalize case of pathname. Has no effect under Posix""" - return s - - -# Return whether a path is absolute. -# Trivial in Posix, harder on the Mac or MS-DOS. - -def isabs(s): - """Test whether a path is absolute""" - return s.startswith('/') - - -# Join pathnames. -# Ignore the previous parts if a part is absolute. -# Insert a '/' unless the first part is empty or already ends in '/'. - -def join(a, *p): - """Join two or more pathname components, inserting '/' as needed. - If any component is an absolute path, all previous path components - will be discarded. An empty last part will result in a path that - ends with a separator.""" - path = a - for b in p: - if b.startswith('/'): - path = b - elif path == '' or path.endswith('/'): - path += b - else: - path += '/' + b - return path - - -# Split a path in head (everything up to the last '/') and tail (the -# rest). If the path ends in '/', tail will be empty. If there is no -# '/' in the path, head will be empty. -# Trailing '/'es are stripped from head unless it is the root. - -def split(p): - """Split a pathname. Returns tuple "(head, tail)" where "tail" is - everything after the final slash. Either part may be empty.""" - i = p.rfind('/') + 1 - head, tail = p[:i], p[i:] - if head and head != '/'*len(head): - head = head.rstrip('/') - return head, tail - - -# Split a path in root and extension. -# The extension is everything starting at the last dot in the last -# pathname component; the root is everything before that. -# It is always true that root + ext == p. - -def splitext(p): - return genericpath._splitext(p, sep, altsep, extsep) -splitext.__doc__ = genericpath._splitext.__doc__ - -# Split a pathname into a drive specification and the rest of the -# path. Useful on DOS/Windows/NT; on Unix, the drive is always empty. - -def splitdrive(p): - """Split a pathname into drive and path. On Posix, drive is always - empty.""" - return '', p - - -# Return the tail (basename) part of a path, same as split(path)[1]. - -def basename(p): - """Returns the final component of a pathname""" - i = p.rfind('/') + 1 - return p[i:] - - -# Return the head (dirname) part of a path, same as split(path)[0]. - -def dirname(p): - """Returns the directory component of a pathname""" - i = p.rfind('/') + 1 - head = p[:i] - if head and head != '/'*len(head): - head = head.rstrip('/') - return head - - -# Is a path a symbolic link? -# This will always return false on systems where os.lstat doesn't exist. - -def islink(path): - """Test whether a path is a symbolic link""" - try: - st = os.lstat(path) - except (os.error, AttributeError): - return False - return stat.S_ISLNK(st.st_mode) - -# Being true for dangling symbolic links is also useful. - -def lexists(path): - """Test whether a path exists. Returns True for broken symbolic links""" - try: - os.lstat(path) - except os.error: - return False - return True - - -# Are two filenames really pointing to the same file? - -def samefile(f1, f2): - """Test whether two pathnames reference the same actual file""" - s1 = os.stat(f1) - s2 = os.stat(f2) - return samestat(s1, s2) - - -# Are two open files really referencing the same file? -# (Not necessarily the same file descriptor!) - -def sameopenfile(fp1, fp2): - """Test whether two open file objects reference the same file""" - s1 = os.fstat(fp1) - s2 = os.fstat(fp2) - return samestat(s1, s2) - - -# Are two stat buffers (obtained from stat, fstat or lstat) -# describing the same file? - -def samestat(s1, s2): - """Test whether two stat buffers reference the same file""" - return s1.st_ino == s2.st_ino and \ - s1.st_dev == s2.st_dev - - -# Is a path a mount point? -# (Does this work for all UNIXes? Is it even guaranteed to work by Posix?) - -def ismount(path): - """Test whether a path is a mount point""" - if islink(path): - # A symlink can never be a mount point - return False - try: - s1 = os.lstat(path) - s2 = os.lstat(join(path, '..')) - except os.error: - return False # It doesn't exist -- so not a mount point :-) - dev1 = s1.st_dev - dev2 = s2.st_dev - if dev1 != dev2: - return True # path/.. on a different device as path - ino1 = s1.st_ino - ino2 = s2.st_ino - if ino1 == ino2: - return True # path/.. is the same i-node as path - return False - - -# Directory tree walk. -# For each directory under top (including top itself, but excluding -# '.' and '..'), func(arg, dirname, filenames) is called, where -# dirname is the name of the directory and filenames is the list -# of files (and subdirectories etc.) in the directory. -# The func may modify the filenames list, to implement a filter, -# or to impose a different order of visiting. - -def walk(top, func, arg): - """Directory tree walk with callback function. - - For each directory in the directory tree rooted at top (including top - itself, but excluding '.' and '..'), call func(arg, dirname, fnames). - dirname is the name of the directory, and fnames a list of the names of - the files and subdirectories in dirname (excluding '.' and '..'). func - may modify the fnames list in-place (e.g. via del or slice assignment), - and walk will only recurse into the subdirectories whose names remain in - fnames; this can be used to implement a filter, or to impose a specific - order of visiting. No semantics are defined for, or required of, arg, - beyond that arg is always passed to func. It can be used, e.g., to pass - a filename pattern, or a mutable object designed to accumulate - statistics. Passing None for arg is common.""" - warnings.warnpy3k("In 3.x, os.path.walk is removed in favor of os.walk.", - stacklevel=2) - try: - names = os.listdir(top) - except os.error: - return - func(arg, top, names) - for name in names: - name = join(top, name) - try: - st = os.lstat(name) - except os.error: - continue - if stat.S_ISDIR(st.st_mode): - walk(name, func, arg) - - -# Expand paths beginning with '~' or '~user'. -# '~' means $HOME; '~user' means that user's home directory. -# If the path doesn't begin with '~', or if the user or $HOME is unknown, -# the path is returned unchanged (leaving error reporting to whatever -# function is called with the expanded path as argument). -# See also module 'glob' for expansion of *, ? and [...] in pathnames. -# (A function should also be defined to do full *sh-style environment -# variable expansion.) - -def expanduser(path): - """Expand ~ and ~user constructions. If user or $HOME is unknown, - do nothing.""" - if not path.startswith('~'): - return path - i = path.find('/', 1) - if i < 0: - i = len(path) - if i == 1: - if 'HOME' not in os.environ: - import pwd - userhome = pwd.getpwuid(os.getuid()).pw_dir - else: - userhome = os.environ['HOME'] - else: - import pwd - try: - pwent = pwd.getpwnam(path[1:i]) - except KeyError: - return path - userhome = pwent.pw_dir - userhome = userhome.rstrip('/') - return (userhome + path[i:]) or '/' - - -# Expand paths containing shell variable substitutions. -# This expands the forms $variable and ${variable} only. -# Non-existent variables are left unchanged. - -_varprog = None - -def expandvars(path): - """Expand shell variables of form $var and ${var}. Unknown variables - are left unchanged.""" - global _varprog - if '$' not in path: - return path - if not _varprog: - import re - _varprog = re.compile(r'\$(\w+|\{[^}]*\})') - i = 0 - while True: - m = _varprog.search(path, i) - if not m: - break - i, j = m.span(0) - name = m.group(1) - if name.startswith('{') and name.endswith('}'): - name = name[1:-1] - if name in os.environ: - tail = path[j:] - path = path[:i] + os.environ[name] - i = len(path) - path += tail - else: - i = j - return path - - -# Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B. -# It should be understood that this may change the meaning of the path -# if it contains symbolic links! - -def normpath(path): - """Normalize path, eliminating double slashes, etc.""" - # Preserve unicode (if path is unicode) - slash, dot = (u'/', u'.') if isinstance(path, _unicode) else ('/', '.') - if path == '': - return dot - initial_slashes = path.startswith('/') - # POSIX allows one or two initial slashes, but treats three or more - # as single slash. - if (initial_slashes and - path.startswith('//') and not path.startswith('///')): - initial_slashes = 2 - comps = path.split('/') - new_comps = [] - for comp in comps: - if comp in ('', '.'): - continue - if (comp != '..' or (not initial_slashes and not new_comps) or - (new_comps and new_comps[-1] == '..')): - new_comps.append(comp) - elif new_comps: - new_comps.pop() - comps = new_comps - path = slash.join(comps) - if initial_slashes: - path = slash*initial_slashes + path - return path or dot - - -def abspath(path): - """Return an absolute path.""" - if not isabs(path): - if isinstance(path, _unicode): - cwd = os.getcwdu() - else: - cwd = os.getcwd() - path = join(cwd, path) - return normpath(path) - - -# Return a canonical path (i.e. the absolute location of a file on the -# filesystem). - -def realpath(filename): - """Return the canonical path of the specified filename, eliminating any -symbolic links encountered in the path.""" - path, ok = _joinrealpath('', filename, {}) - return abspath(path) - -# Join two paths, normalizing ang eliminating any symbolic links -# encountered in the second path. -def _joinrealpath(path, rest, seen): - if isabs(rest): - rest = rest[1:] - path = sep - - while rest: - name, _, rest = rest.partition(sep) - if not name or name == curdir: - # current dir - continue - if name == pardir: - # parent dir - if path: - path, name = split(path) - if name == pardir: - path = join(path, pardir, pardir) - else: - path = pardir - continue - newpath = join(path, name) - if not islink(newpath): - path = newpath - continue - # Resolve the symbolic link - if newpath in seen: - # Already seen this path - path = seen[newpath] - if path is not None: - # use cached value - continue - # The symlink is not resolved, so we must have a symlink loop. - # Return already resolved part + rest of the path unchanged. - return join(newpath, rest), False - seen[newpath] = None # not resolved symlink - path, ok = _joinrealpath(path, os.readlink(newpath), seen) - if not ok: - return join(path, rest), False - seen[newpath] = path # resolved symlink - - return path, True - - -supports_unicode_filenames = (sys.platform == 'darwin') - -def relpath(path, start=curdir): - """Return a relative version of a path""" - - if not path: - raise ValueError("no path specified") - - start_list = [x for x in abspath(start).split(sep) if x] - path_list = [x for x in abspath(path).split(sep) if x] - - # Work out how much of the filepath is shared by start and path. - i = len(commonprefix([start_list, path_list])) - - rel_list = [pardir] * (len(start_list)-i) + path_list[i:] - if not rel_list: - return curdir - return join(*rel_list) diff --git a/PythonEnv/2.7/Lib/posixpath.pyc b/PythonEnv/2.7/Lib/posixpath.pyc deleted file mode 100644 index 2cbce408ff0b640bd107612ee30c2a9a279b5224..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12185 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...) The substring matched by the group is accessible by name. - (?P=name) Matches the text matched earlier by the group named name. - (?#...) A comment; ignored. - (?=...) Matches if ... matches next, but doesn't consume the string. - (?!...) Matches if ... doesn't match next. - (?<=...) Matches if preceded by ... (must be fixed length). - (?= 0x02020000: - __all__.append("finditer") - def finditer(pattern, string, flags=0): - """Return an iterator over all non-overlapping matches in the - string. For each match, the iterator returns a match object. - - Empty matches are included in the result.""" - return _compile(pattern, flags).finditer(string) - -def compile(pattern, flags=0): - "Compile a regular expression pattern, returning a pattern object." - return _compile(pattern, flags) - -def purge(): - "Clear the regular expression cache" - _cache.clear() - _cache_repl.clear() - -def template(pattern, flags=0): - "Compile a template pattern, returning a pattern object" - return _compile(pattern, flags|T) - -_alphanum = frozenset( - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") - -def escape(pattern): - "Escape all non-alphanumeric characters in pattern." - s = list(pattern) - alphanum = _alphanum - for i, c in enumerate(pattern): - if c not in alphanum: - if c == "\000": - s[i] = "\\000" - else: - s[i] = "\\" + c - return pattern[:0].join(s) - -# -------------------------------------------------------------------- -# internals - -_cache = {} -_cache_repl = {} - -_pattern_type = type(sre_compile.compile("", 0)) - -_MAXCACHE = 100 - -def _compile(*key): - # internal: compile pattern - cachekey = (type(key[0]),) + key - p = _cache.get(cachekey) - if p is not None: - return p - pattern, flags = key - if isinstance(pattern, _pattern_type): - if flags: - raise ValueError('Cannot process flags argument with a compiled pattern') - return pattern - if not sre_compile.isstring(pattern): - raise TypeError, "first argument must be string or compiled pattern" - try: - p = sre_compile.compile(pattern, flags) - except error, v: - raise error, v # invalid expression - if len(_cache) >= _MAXCACHE: - _cache.clear() - _cache[cachekey] = p - return p - -def _compile_repl(*key): - # internal: compile replacement pattern - p = _cache_repl.get(key) - if p is not None: - return p - repl, pattern = key - try: - p = sre_parse.parse_template(repl, pattern) - except error, v: - raise error, v # invalid expression - if len(_cache_repl) >= _MAXCACHE: - _cache_repl.clear() - _cache_repl[key] = p - return p - -def _expand(pattern, match, template): - # internal: match.expand implementation hook - template = sre_parse.parse_template(template, pattern) - return sre_parse.expand_template(template, match) - -def _subx(pattern, template): - # internal: pattern.sub/subn implementation helper - template = _compile_repl(template, pattern) - if not template[0] and len(template[1]) == 1: - # literal replacement - return template[1][0] - def filter(match, template=template): - return sre_parse.expand_template(template, match) - return filter - -# register myself for pickling - -import copy_reg - -def _pickle(p): - return _compile, (p.pattern, p.flags) - -copy_reg.pickle(_pattern_type, _pickle, _compile) - -# -------------------------------------------------------------------- -# experimental stuff (see python-dev discussions for details) - -class Scanner: - def __init__(self, lexicon, flags=0): - from sre_constants import BRANCH, SUBPATTERN - self.lexicon = lexicon - # combine phrases into a compound pattern - p = [] - s = sre_parse.Pattern() - s.flags = flags - for phrase, action in lexicon: - p.append(sre_parse.SubPattern(s, [ - (SUBPATTERN, (len(p)+1, sre_parse.parse(phrase, flags))), - ])) - s.groups = len(p)+1 - p = sre_parse.SubPattern(s, [(BRANCH, (None, p))]) - self.scanner = sre_compile.compile(p) - def scan(self, string): - result = [] - append = result.append - match = self.scanner.scanner(string).match - i = 0 - while 1: - m = match() - if not m: - break - j = m.end() - if i == j: - break - action = self.lexicon[m.lastindex-1][1] - if hasattr(action, '__call__'): - self.match = m - action = action(self, m.group()) - if action is not None: - append(action) - i = j - return result, string[i:] diff --git a/PythonEnv/2.7/Lib/re.pyc b/PythonEnv/2.7/Lib/re.pyc deleted file mode 100644 index f95444a656a46d4e26329c2aa3ad71d030145cf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13871 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 C<`Uch diff --git a/PythonEnv/2.7/Lib/site-packages/_markerlib/__init__.py b/PythonEnv/2.7/Lib/site-packages/_markerlib/__init__.py deleted file mode 100644 index e2b237b1f..000000000 --- a/PythonEnv/2.7/Lib/site-packages/_markerlib/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -try: - import ast - from _markerlib.markers import default_environment, compile, interpret -except ImportError: - if 'ast' in globals(): - raise - def default_environment(): - return {} - def compile(marker): - def marker_fn(environment=None, override=None): - # 'empty markers are True' heuristic won't install extra deps. - return not marker.strip() - marker_fn.__doc__ = marker - return marker_fn - def interpret(marker, environment=None, override=None): - return compile(marker)() diff --git a/PythonEnv/2.7/Lib/site-packages/_markerlib/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/_markerlib/__init__.pyc deleted file mode 100644 index 614edeada9aa2a69a34e3f8ed2d9d75b7588b3a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1292 zcmcgqO^?$s5FICJpk=E?Anu4$4{Q%ykPt$wmK8!m6`MUQsv@j>xZTjiiEOu05nNye z{80V@KLF-Az*hW#M)AwU_Ke@W=kVuvlpp;#E9lQN;O}!D_5;KAA(cd>pqgmT0lxv& zf|`Kl0W~4bLuw+LM z#&pFsBhrH2^8fkd1|MJj;%7DqIdpd!O0~$=wUbJ3D%0vlY3H!7Xq&F8l^Y^QJ7qef zoI_e>-M`KR|DW)%5w;PZftlHaf&K&gj_1lJ>9TT{>pZ=v^l`l~s@#e4N~bSWzFwwp zw(hdkr+SkLC&lIVxS77vbPv`<9mVy2Y-9TvV+CenX2=- z4m)=hy~+RWMj2C;%1h*8p6Q$LI_*InZ)Ja^T<8%9qdN+E%Ft-mYUSORvTO?}{YnBw z6LjF2dis8D51bQ-iz{fM7m0h}P!wO$eTn}-Umt0IBXM!f&9fs@cJnap#{wjO!2{QbJdewBTai_*G!jom)=2>kM=yTnT ikM_`#Lkmxvwp`ch8Emq*8A5R&?u)TF6tNfv!}vESHZ5)d diff --git a/PythonEnv/2.7/Lib/site-packages/_markerlib/markers.py b/PythonEnv/2.7/Lib/site-packages/_markerlib/markers.py deleted file mode 100644 index fa837061e..000000000 --- a/PythonEnv/2.7/Lib/site-packages/_markerlib/markers.py +++ /dev/null @@ -1,119 +0,0 @@ -# -*- coding: utf-8 -*- -"""Interpret PEP 345 environment markers. - -EXPR [in|==|!=|not in] EXPR [or|and] ... - -where EXPR belongs to any of those: - - python_version = '%s.%s' % (sys.version_info[0], sys.version_info[1]) - python_full_version = sys.version.split()[0] - os.name = os.name - sys.platform = sys.platform - platform.version = platform.version() - platform.machine = platform.machine() - platform.python_implementation = platform.python_implementation() - a free string, like '2.6', or 'win32' -""" - -__all__ = ['default_environment', 'compile', 'interpret'] - -import ast -import os -import platform -import sys -import weakref - -_builtin_compile = compile - -try: - from platform import python_implementation -except ImportError: - if os.name == "java": - # Jython 2.5 has ast module, but not platform.python_implementation() function. - def python_implementation(): - return "Jython" - else: - raise - - -# restricted set of variables -_VARS = {'sys.platform': sys.platform, - 'python_version': '%s.%s' % sys.version_info[:2], - # FIXME parsing sys.platform is not reliable, but there is no other - # way to get e.g. 2.7.2+, and the PEP is defined with sys.version - 'python_full_version': sys.version.split(' ', 1)[0], - 'os.name': os.name, - 'platform.version': platform.version(), - 'platform.machine': platform.machine(), - 'platform.python_implementation': python_implementation(), - 'extra': None # wheel extension - } - -for var in list(_VARS.keys()): - if '.' in var: - _VARS[var.replace('.', '_')] = _VARS[var] - -def default_environment(): - """Return copy of default PEP 385 globals dictionary.""" - return dict(_VARS) - -class ASTWhitelist(ast.NodeTransformer): - def __init__(self, statement): - self.statement = statement # for error messages - - ALLOWED = (ast.Compare, ast.BoolOp, ast.Attribute, ast.Name, ast.Load, ast.Str) - # Bool operations - ALLOWED += (ast.And, ast.Or) - # Comparison operations - ALLOWED += (ast.Eq, ast.Gt, ast.GtE, ast.In, ast.Is, ast.IsNot, ast.Lt, ast.LtE, ast.NotEq, ast.NotIn) - - def visit(self, node): - """Ensure statement only contains allowed nodes.""" - if not isinstance(node, self.ALLOWED): - raise SyntaxError('Not allowed in environment markers.\n%s\n%s' % - (self.statement, - (' ' * node.col_offset) + '^')) - return ast.NodeTransformer.visit(self, node) - - def visit_Attribute(self, node): - """Flatten one level of attribute access.""" - new_node = ast.Name("%s.%s" % (node.value.id, node.attr), node.ctx) - return ast.copy_location(new_node, node) - -def parse_marker(marker): - tree = ast.parse(marker, mode='eval') - new_tree = ASTWhitelist(marker).generic_visit(tree) - return new_tree - -def compile_marker(parsed_marker): - return _builtin_compile(parsed_marker, '', 'eval', - dont_inherit=True) - -_cache = weakref.WeakValueDictionary() - -def compile(marker): - """Return compiled marker as a function accepting an environment dict.""" - try: - return _cache[marker] - except KeyError: - pass - if not marker.strip(): - def marker_fn(environment=None, override=None): - """""" - return True - else: - compiled_marker = compile_marker(parse_marker(marker)) - def marker_fn(environment=None, override=None): - """override updates environment""" - if override is None: - override = {} - if environment is None: - environment = default_environment() - environment.update(override) - return eval(compiled_marker, environment) - marker_fn.__doc__ = marker - _cache[marker] = marker_fn - return _cache[marker] - -def interpret(marker, environment=None): - return compile(marker)(environment) diff --git a/PythonEnv/2.7/Lib/site-packages/_markerlib/markers.pyc b/PythonEnv/2.7/Lib/site-packages/_markerlib/markers.pyc deleted file mode 100644 index adf3b14527fd8741841a42fcc9c8bddf4d4bc127..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5570 zcmcgw>vG%16+Qr|3u(!+WL+%VNubWSqB}OzI*pxrWH+)cdz7lQ3wa`!k%EDUr3?xJ zXzWt9W|Wyul{^&FGeLDTu2S~ni7NqFZe=U+&9GpGa%lXc2S^D2(_5Q#A z^M@7{pHbXD$EE+}5Jf~yv<^isMJ3uRQ4@5Tq7h15YJzEL@JoHVOieH?e}tMNeR`Cd zqol^DIZj8j!W^ZfOa~QeR>;{(Kc=#((tefle~{xiszjZ06phioOZnd^8mI5DmMI*eP0!E}+K_Jq@bN zGAG#LjD47rhl_Zq2sMk5v4c6f-JGU34@u3Cnx@W0?mThm(ay)z#AfD6&C>oTw2}i_TriEeHEw2_wF4p-8)V*$;o7rgj~}$P1aSr{RIZoCPIZexaL$rk&*n=o)^s(-eLE zl|iO2-e=W{1@$El!q&?;<%tH81?#7hg*M`YZlYNCp|MICy!TFlVwBKp=Sq3n~gg95B8R)N7#VCym|#FS@(E7n_&8 z-R-S7T}`m9Xo%X4)9puUx3{Si}=?T33xZwJA zxO?Q6FvAiq&FdjYPcS`%x*h>TtT1K?a~@5x=fWBd@6C(3jd79av=AA#Kg~KVj7wht zJ;1RT=xt_U6#Bzq$#-j;m#E&DJd~x>r40tE=VgoPs~`-14hNr2fl%K9&sV0Gr(P@T zibEFWV7>pdPrbb)+YJ-#MRAJ_FwBqY0-k`(OvCdBU#|L_XAd7{rq6I$_*}#At!_Tw zdI{*0SetFYT1H7oti$Bap$n zo3%0q)Hl(rrMidoGf;__rO6Sj9RW2?wHGEy_F6?=nng<2^>w__Kq~9A@0zY& z(>}YjxZBq?-l<_1i#3KdVcJp>MOQaAo^Gu@GHigGN0{`@TApXQKq2z2ED5r9TPtH2 z?NA%TFg38A=XscF&OIs@Cp*O0Mj-V$fQSe3y3Z0)e-Sf3#-(|)2)otU)S&`VQg5j4Tv#dVB`IQT2IBa{GXxY)S!iW|AETqyuN}<3V>0k zQu>8E?>=@b<1J3?Z`pMn3~Sd2H!y7krW42c#^GoM4x*AZa}cm>*t8Af4N)pkQ9`K0 zFp(f-p_`cQ<$GI3OIW}51G#lBM=Kh;VuW>HB=P<{!!jgi_?gWp-b9m9<4!;oqP) zk@*YBanYqeizEaPg9F4}*skERVsDE@`ef7w)u9{)q5={xMCSC`y;N#KiNaj~u!mFK zTltdf!+MLi#}`|JSPA2UscaDn0v^wO{^v}wq@>FsOAss1P$=i|*`_-Qj@IRZcB-(n zqSPF0iZSD3lzxH+ngkI0xcEth!zLBoHHsXMqN z&XPOfRGbNXC!K~QZi#R~3uj~-*nX#uq+F6D!H3zd&uaD`aKixCD)CQ24`RY3zp@Lo`N9M`!_Gq>xwPw z?sM8h>_>KWr{G1!*Byn?&BB|&D~**Wote^Q7~LekRi|27gxr!_DK9QmMk?hAw{q!6 DMu$fO diff --git a/PythonEnv/2.7/Lib/site-packages/easy_install.py b/PythonEnv/2.7/Lib/site-packages/easy_install.py deleted file mode 100644 index d87e98403..000000000 --- a/PythonEnv/2.7/Lib/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/PythonEnv/2.7/Lib/site-packages/easy_install.pyc b/PythonEnv/2.7/Lib/site-packages/easy_install.pyc deleted file mode 100644 index 222d9290b51f04e999d49d6fae2bffbbc0b5a942..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354 zcmYk0%}T>S5XWbeT16DRd$7kGY!EMkh$z^DP(P3a1Z)bM6d0!P1;8B5 zPT)N|=r_*^tJck8jkARe-Lnf(8Z#@swbH40M13Kw)J_QfOO`RJ#0jAQmg)8Mm|DVQ>t!xrDNR|e68K1`PiWvMTK_! z35&MkuU)LYTeweto!{`KE_l!p=Z!44vckZ}VtLc;KX_-oY7O4^+F?qVCMWES{Q(e{ BTYvxn diff --git a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/PKG-INFO b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/PKG-INFO deleted file mode 100644 index b192ea88f..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/PKG-INFO +++ /dev/null @@ -1,87 +0,0 @@ -Metadata-Version: 1.1 -Name: pip -Version: 1.4.1 -Summary: A tool for installing and managing Python packages. -Home-page: http://www.pip-installer.org -Author: The pip developers -Author-email: python-virtualenv@groups.google.com -License: MIT -Description: - Project Info - ============ - - * Project Page: https://github.com/pypa/pip - * Install howto: http://www.pip-installer.org/en/latest/installing.html - * Changelog: http://www.pip-installer.org/en/latest/news.html - * Bug Tracking: https://github.com/pypa/pip/issues - * Mailing list: http://groups.google.com/group/python-virtualenv - * Docs: http://www.pip-installer.org/ - * IRC: #pip on Freenode. - - Quickstart - ========== - - Install a package: - - :: - - $ pip install SomePackage==1.0 - [...] - Successfully installed SomePackage - - Show what files were installed: - - :: - - $ pip show --files SomePackage - Name: SomePackage - Version: 1.0 - Location: /my/env/lib/pythonx.x/site-packages - Files: - ../somepackage/__init__.py - [...] - - List what packages are outdated: - - :: - - $ pip list --outdated - SomePackage (Current: 1.0 Latest: 2.0) - - Upgrade a package: - - :: - - $ pip install --upgrade SomePackage - [...] - Found existing installation: SomePackage 1.0 - Uninstalling SomePackage: - Successfully uninstalled SomePackage - Running setup.py install for SomePackage - Successfully installed SomePackage - - Uninstall a package: - - :: - - $ pip uninstall SomePackage - Uninstalling SomePackage: - /my/env/lib/pythonx.x/site-packages/somepackage - Proceed (y/n)? y - Successfully uninstalled SomePackage - - -Keywords: easy_install distutils setuptools egg virtualenv -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Topic :: Software Development :: Build Tools -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.5 -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.1 -Classifier: Programming Language :: Python :: 3.2 -Classifier: Programming Language :: Python :: 3.3 diff --git a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/SOURCES.txt b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/SOURCES.txt deleted file mode 100644 index 7426a21dc..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/SOURCES.txt +++ /dev/null @@ -1,116 +0,0 @@ -AUTHORS.txt -CHANGES.txt -LICENSE.txt -MANIFEST.in -PROJECT.txt -README.rst -setup.cfg -setup.py -docs/configuration.rst -docs/cookbook.rst -docs/development.rst -docs/index.rst -docs/installing.rst -docs/logic.rst -docs/news.rst -docs/other-tools.rst -docs/quickstart.rst -docs/usage.rst -pip/__init__.py -pip/__main__.py -pip/basecommand.py -pip/baseparser.py -pip/cacert.pem -pip/cmdoptions.py -pip/download.py -pip/exceptions.py -pip/index.py -pip/locations.py -pip/log.py -pip/pep425tags.py -pip/req.py -pip/runner.py -pip/status_codes.py -pip/util.py -pip/wheel.py -pip.egg-info/PKG-INFO -pip.egg-info/SOURCES.txt -pip.egg-info/dependency_links.txt -pip.egg-info/entry_points.txt -pip.egg-info/not-zip-safe -pip.egg-info/requires.txt -pip.egg-info/top_level.txt -pip/backwardcompat/__init__.py -pip/backwardcompat/ssl_match_hostname.py -pip/commands/__init__.py -pip/commands/bundle.py -pip/commands/completion.py -pip/commands/freeze.py -pip/commands/help.py -pip/commands/install.py -pip/commands/list.py -pip/commands/search.py -pip/commands/show.py -pip/commands/uninstall.py -pip/commands/unzip.py -pip/commands/wheel.py -pip/commands/zip.py -pip/vcs/__init__.py -pip/vcs/bazaar.py -pip/vcs/git.py -pip/vcs/mercurial.py -pip/vcs/subversion.py -pip/vendor/__init__.py -pip/vendor/six.py -pip/vendor/distlib/__init__.py -pip/vendor/distlib/compat.py -pip/vendor/distlib/database.py -pip/vendor/distlib/index.py -pip/vendor/distlib/locators.py -pip/vendor/distlib/manifest.py -pip/vendor/distlib/markers.py -pip/vendor/distlib/metadata.py -pip/vendor/distlib/resources.py -pip/vendor/distlib/scripts.py -pip/vendor/distlib/util.py -pip/vendor/distlib/version.py -pip/vendor/distlib/wheel.py -pip/vendor/distlib/_backport/__init__.py -pip/vendor/distlib/_backport/misc.py -pip/vendor/distlib/_backport/shutil.py -pip/vendor/distlib/_backport/sysconfig.py -pip/vendor/distlib/_backport/tarfile.py -pip/vendor/html5lib/__init__.py -pip/vendor/html5lib/constants.py -pip/vendor/html5lib/html5parser.py -pip/vendor/html5lib/ihatexml.py -pip/vendor/html5lib/inputstream.py -pip/vendor/html5lib/sanitizer.py -pip/vendor/html5lib/tokenizer.py -pip/vendor/html5lib/utils.py -pip/vendor/html5lib/filters/__init__.py -pip/vendor/html5lib/filters/_base.py -pip/vendor/html5lib/filters/alphabeticalattributes.py -pip/vendor/html5lib/filters/inject_meta_charset.py -pip/vendor/html5lib/filters/lint.py -pip/vendor/html5lib/filters/optionaltags.py -pip/vendor/html5lib/filters/sanitizer.py -pip/vendor/html5lib/filters/whitespace.py -pip/vendor/html5lib/serializer/__init__.py -pip/vendor/html5lib/serializer/htmlserializer.py -pip/vendor/html5lib/treebuilders/__init__.py -pip/vendor/html5lib/treebuilders/_base.py -pip/vendor/html5lib/treebuilders/dom.py -pip/vendor/html5lib/treebuilders/etree.py -pip/vendor/html5lib/treebuilders/etree_lxml.py -pip/vendor/html5lib/treewalkers/__init__.py -pip/vendor/html5lib/treewalkers/_base.py -pip/vendor/html5lib/treewalkers/dom.py -pip/vendor/html5lib/treewalkers/etree.py -pip/vendor/html5lib/treewalkers/genshistream.py -pip/vendor/html5lib/treewalkers/lxmletree.py -pip/vendor/html5lib/treewalkers/pulldom.py -pip/vendor/html5lib/trie/__init__.py -pip/vendor/html5lib/trie/_base.py -pip/vendor/html5lib/trie/datrie.py -pip/vendor/html5lib/trie/py.py \ No newline at end of file diff --git a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/dependency_links.txt b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/dependency_links.txt deleted file mode 100644 index 8b1378917..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/entry_points.txt b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/entry_points.txt deleted file mode 100644 index 5f7b7cf99..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/entry_points.txt +++ /dev/null @@ -1,4 +0,0 @@ -[console_scripts] -pip = pip:main -pip-2.7 = pip:main - diff --git a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/not-zip-safe b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/not-zip-safe deleted file mode 100644 index 8b1378917..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/not-zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/requires.txt b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/requires.txt deleted file mode 100644 index 1c97870de..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/requires.txt +++ /dev/null @@ -1,7 +0,0 @@ - - -[testing] -nose>=1.3.0 -virtualenv>=1.10 -scripttest>=1.1.1 -mock \ No newline at end of file diff --git a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/top_level.txt b/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/top_level.txt deleted file mode 100644 index a1b589e38..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip-1.4.1-py2.7.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/PythonEnv/2.7/Lib/site-packages/pip/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/__init__.py deleted file mode 100644 index 8bc68aaca..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/__init__.py +++ /dev/null @@ -1,235 +0,0 @@ -#!/usr/bin/env python -import os -import optparse - -import sys -import re - -from pip.exceptions import InstallationError, CommandError, PipError -from pip.log import logger -from pip.util import get_installed_distributions, get_prog -from pip.vcs import git, mercurial, subversion, bazaar # noqa -from pip.baseparser import create_main_parser -from pip.commands import commands, get_similar_commands, get_summaries - - -# The version as used in the setup.py and the docs conf.py -__version__ = "1.4.1" - -def autocomplete(): - """Command and option completion for the main option parser (and options) - and its subcommands (and options). - - Enable by sourcing one of the completion shell scripts (bash or zsh). - """ - # Don't complete if user hasn't sourced bash_completion file. - if 'PIP_AUTO_COMPLETE' not in os.environ: - return - cwords = os.environ['COMP_WORDS'].split()[1:] - cword = int(os.environ['COMP_CWORD']) - try: - current = cwords[cword - 1] - except IndexError: - current = '' - - subcommands = [cmd for cmd, summary in get_summaries()] - options = [] - # subcommand - try: - subcommand_name = [w for w in cwords if w in subcommands][0] - except IndexError: - subcommand_name = None - - parser = create_main_parser() - # subcommand options - if subcommand_name: - # special case: 'help' subcommand has no options - if subcommand_name == 'help': - sys.exit(1) - # special case: list locally installed dists for uninstall command - if subcommand_name == 'uninstall' and not current.startswith('-'): - installed = [] - lc = current.lower() - for dist in get_installed_distributions(local_only=True): - if dist.key.startswith(lc) and dist.key not in cwords[1:]: - installed.append(dist.key) - # if there are no dists installed, fall back to option completion - if installed: - for dist in installed: - print(dist) - sys.exit(1) - - subcommand = commands[subcommand_name](parser) - options += [(opt.get_opt_string(), opt.nargs) - for opt in subcommand.parser.option_list_all - if opt.help != optparse.SUPPRESS_HELP] - - # filter out previously specified options from available options - prev_opts = [x.split('=')[0] for x in cwords[1:cword - 1]] - options = [(x, v) for (x, v) in options if x not in prev_opts] - # filter options by current input - options = [(k, v) for k, v in options if k.startswith(current)] - for option in options: - opt_label = option[0] - # append '=' to options which require args - if option[1]: - opt_label += '=' - print(opt_label) - else: - # show main parser options only when necessary - if current.startswith('-') or current.startswith('--'): - 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) - - subcommands += [i.get_opt_string() for i in opts - if i.help != optparse.SUPPRESS_HELP] - - print(' '.join([x for x in subcommands if x.startswith(current)])) - sys.exit(1) - - -def parseopts(args): - parser = create_main_parser() - parser.main = True # so the help formatter knows - - # create command listing - command_summaries = get_summaries() - - description = [''] + ['%-27s %s' % (i, j) for i, j in command_summaries] - parser.description = '\n'.join(description) - - options, args = parser.parse_args(args) - - if options.version: - sys.stdout.write(parser.version) - sys.stdout.write(os.linesep) - sys.exit() - - # pip || pip help || pip --help -> print_help() - if not args or (args[0] == 'help' and len(args) == 1): - parser.print_help() - sys.exit() - - if not args: - msg = ('You must give a command ' - '(use "pip --help" to see a list of commands)') - raise CommandError(msg) - - command = args[0].lower() - - if command not in commands: - guess = get_similar_commands(command) - - msg = ['unknown command "%s"' % command] - if guess: - msg.append('maybe you meant "%s"' % guess) - - raise CommandError(' - '.join(msg)) - - return command, options, args, parser - - -def main(initial_args=None): - if initial_args is None: - initial_args = sys.argv[1:] - - autocomplete() - - try: - cmd_name, options, args, parser = parseopts(initial_args) - except PipError: - e = sys.exc_info()[1] - sys.stderr.write("ERROR: %s" % e) - sys.stderr.write(os.linesep) - sys.exit(1) - - command = commands[cmd_name](parser) # see baseparser.Command - return command.main(args[1:], options) - - -def bootstrap(): - """ - Bootstrapping function to be called from install-pip.py script. - """ - return main(['install', '--upgrade', 'pip'] + sys.argv[1:]) - -############################################################ -## Writing freeze files - - -class FrozenRequirement(object): - - def __init__(self, name, req, editable, comments=()): - self.name = name - self.req = req - self.editable = editable - self.comments = comments - - _rev_re = re.compile(r'-r(\d+)$') - _date_re = re.compile(r'-(20\d\d\d\d\d\d)$') - - @classmethod - def from_dist(cls, dist, dependency_links, find_tags=False): - location = os.path.normcase(os.path.abspath(dist.location)) - comments = [] - from pip.vcs import vcs, get_src_requirement - if vcs.get_backend_name(location): - editable = True - try: - req = get_src_requirement(dist, location, find_tags) - except InstallationError: - ex = sys.exc_info()[1] - logger.warn("Error when trying to get requirement for VCS system %s, falling back to uneditable format" % ex) - req = None - if req is None: - logger.warn('Could not determine repository location of %s' % location) - comments.append('## !! Could not determine repository location') - req = dist.as_requirement() - editable = False - else: - editable = False - req = dist.as_requirement() - specs = req.specs - assert len(specs) == 1 and specs[0][0] == '==' - version = specs[0][1] - ver_match = cls._rev_re.search(version) - date_match = cls._date_re.search(version) - if ver_match or date_match: - svn_backend = vcs.get_backend('svn') - if svn_backend: - svn_location = svn_backend( - ).get_location(dist, dependency_links) - if not svn_location: - logger.warn( - 'Warning: cannot find svn location for %s' % req) - comments.append('## FIXME: could not find svn URL in dependency_links for this package:') - else: - comments.append('# Installing as editable to satisfy requirement %s:' % req) - if ver_match: - rev = ver_match.group(1) - else: - rev = '{%s}' % date_match.group(1) - editable = True - req = '%s@%s#egg=%s' % (svn_location, rev, cls.egg_name(dist)) - return cls(dist.project_name, req, editable, comments) - - @staticmethod - def egg_name(dist): - name = dist.egg_name() - match = re.search(r'-py\d\.\d$', name) - if match: - name = name[:match.start()] - return name - - def __str__(self): - req = self.req - if self.editable: - req = '-e %s' % req - return '\n'.join(list(self.comments) + [str(req)]) + '\n' - - -if __name__ == '__main__': - exit = main() - if exit: - sys.exit(exit) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/__init__.pyc deleted file mode 100644 index 6f4ca28887441417d3c9ae3fe7aea9c04fbdd4b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8247 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 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/__main__.py b/PythonEnv/2.7/Lib/site-packages/pip/__main__.py deleted file mode 100644 index 5ca374634..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/__main__.py +++ /dev/null @@ -1,7 +0,0 @@ -import sys -from .runner import run - -if __name__ == '__main__': - exit = run() - if exit: - sys.exit(exit) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/__main__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/__main__.pyc deleted file mode 100644 index 5b4567bf604b7305d0cc1a5f32e5706dd855034d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmYk1!Ab)$5Qb;6Ytd4{$JmQKco9TIK`%v$)I*^J!frEe$L^-@|K{FC_^CdudV@cl#0maq>c`C6`@3alK23Sc2ZflZ)7s1+;}ASGZ^SSx5JKnk{E zN`cZ?0z5~(MZlK{xH#r9JCKq5B{5|bne7k~LEE`-DA|}gXJ<@w#*XiO82mUKwKGw$ zce=bLV?rt~^u{6Ewf^AeQrZh$a#(eRp0m5Do?5d1RKZT)Qqh(Ap%1H#yK}GlY<#Zo rxzL^ioi_P$otNZw!;Su3ZQS&6fy;VhyNa%MfAB-W2v5`qk8ptBuA5Ag diff --git a/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/__init__.py deleted file mode 100644 index 465759d80..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/__init__.py +++ /dev/null @@ -1,125 +0,0 @@ -"""Stuff that differs in different Python versions""" - -import os -import imp -import sys -import site - -__all__ = ['WindowsError'] - -uses_pycache = hasattr(imp, 'cache_from_source') - -class NeverUsedException(Exception): - """this exception should never be raised""" - -try: - WindowsError = WindowsError -except NameError: - WindowsError = NeverUsedException - -try: - #new in Python 3.3 - PermissionError = PermissionError -except NameError: - PermissionError = NeverUsedException - -console_encoding = sys.__stdout__.encoding - -if sys.version_info >= (3,): - from io import StringIO, BytesIO - from functools import reduce - from urllib.error import URLError, HTTPError - from queue import Queue, Empty - from urllib.request import url2pathname - from urllib.request import urlretrieve - from email import message as emailmessage - import urllib.parse as urllib - import urllib.request as urllib2 - import configparser as ConfigParser - import xmlrpc.client as xmlrpclib - import urllib.parse as urlparse - import http.client as httplib - - def cmp(a, b): - return (a > b) - (a < b) - - def b(s): - return s.encode('utf-8') - - def u(s): - return s.decode('utf-8') - - def console_to_str(s): - try: - return s.decode(console_encoding) - except UnicodeDecodeError: - return s.decode('utf_8') - - def fwrite(f, s): - f.buffer.write(b(s)) - - def get_http_message_param(http_message, param, default_value): - return http_message.get_param(param, default_value) - - bytes = bytes - string_types = (str,) - raw_input = input -else: - from cStringIO import StringIO - from urllib2 import URLError, HTTPError - from Queue import Queue, Empty - from urllib import url2pathname, urlretrieve - from email import Message as emailmessage - import urllib - import urllib2 - import urlparse - import ConfigParser - import xmlrpclib - import httplib - - def b(s): - return s - - def u(s): - return s - - def console_to_str(s): - return s - - def fwrite(f, s): - f.write(s) - - def get_http_message_param(http_message, param, default_value): - result = http_message.getparam(param) - return result or default_value - - bytes = str - string_types = (basestring,) - reduce = reduce - cmp = cmp - raw_input = raw_input - BytesIO = StringIO - - -from distutils.sysconfig import get_python_lib, get_python_version - -#site.USER_SITE was created in py2.6 -user_site = getattr(site, 'USER_SITE', None) - - -def product(*args, **kwds): - # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy - # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111 - pools = list(map(tuple, args)) * kwds.get('repeat', 1) - result = [[]] - for pool in pools: - result = [x + [y] for x in result for y in pool] - for prod in result: - yield tuple(prod) - - -## only >=py32 has ssl.match_hostname and ssl.CertificateError -try: - from ssl import match_hostname, CertificateError -except ImportError: - from ssl_match_hostname import match_hostname, CertificateError diff --git a/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/__init__.pyc deleted file mode 100644 index 269938c60af863e5cb1554eb8210192c99bff147..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5529 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 QA9K;1H|tH)Siv{`2bz@t0ssI2 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/ssl_match_hostname.py b/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/ssl_match_hostname.py deleted file mode 100644 index a6fadf424..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/ssl_match_hostname.py +++ /dev/null @@ -1,68 +0,0 @@ -"""The match_hostname() function from Python 3.2, essential when using SSL.""" - -import re - -__version__ = '3.2a3' - -class CertificateError(ValueError): - pass - -def _dnsname_to_pat(dn, max_wildcards=1): - pats = [] - for frag in dn.split(r'.'): - if frag.count('*') > max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survery of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise CertificateError( - "too many wildcards in certificate DNS name: " + repr(dn)) - - if frag == '*': - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append('[^.]+') - else: - # Otherwise, '*' matches any dotless fragment. - frag = re.escape(frag) - pats.append(frag.replace(r'\*', '[^.]*')) - return re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - -def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 rules - are mostly 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_to_pat(value).match(hostname): - return - dnsnames.append(value) - if not san: - # The subject is only checked when subjectAltName is empty - 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_to_pat(value).match(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/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/ssl_match_hostname.pyc b/PythonEnv/2.7/Lib/site-packages/pip/backwardcompat/ssl_match_hostname.pyc deleted file mode 100644 index d01111f374e1115677d6a2ea0205dc87cad36184..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2610 zcmc&$-EJF26h5>5X_}@#qD?{th>;-RnqY~x5>@#TAqk~bl~y)tL~vNGcgFTQ>)p-F zxQV6YhW3VAB(D1wJO__~#3c^^-edv3xvrL&&#UHTVd!RkXPm1^if*ZeA@Y(fAgR0ELE?s!UUxIeR?@!F>Xg(=vhJGhO$Oca zB1;&c{XMy4I%Q+4!`IX`8n{hsUzF zb&>FSVwS6TI0mbD>~ClWM27+G|4au&BcHivg4VY8>99fv6&m?WV(387PL<39a!6){ z9A=S5L5p~P5|j~ZBXv6gnLZr^G(vi-tRZ$6$kk|6XASh(u%Bl0=NJ%x!L#64b(3{x z7#Bdq=sfH4HtIYr^2{u&b{ZV>4adi7`L=17A-g;WShA_yOHvghNLD79j8C#G*ETwm z({@*SDE#naYx^S~q;B)&K(icJDPOJfwbi)58*uDwktWVdaX!hM54PjL8eJGyhY%Ho z&J-fWV}3;2I4ZQ`oIop$;!@@$CaLzTM|qNYEZx7i@up&lN}MuCJtEab#sQ$Tf1hEsw!K1K^s97OqXQtX;(>UZgLhD4 z0F8h;!Gh6@%gzx5{hZjnP55uZko}YP6JHCSs?;UkW^KDohjqVI{l8n){Z=ntwbk#h z*y;uCzM#$BUuY9G0~D3`2Hd&48Uknm?%^r`kLm!^xUvR(8T12Mz!^9spPgNdvfK2F zXL&JX8PG1}S6az_Zon`y zvJzmPm<&U`>8!*L#M;T@9qn2J?Fy|8FK*npQ8Ko+FsWtpn7ErQDcj$y%A0pSxg!n8 z(t0D20mFma(W!alJdH=DDlrl`|R!;3i9g)6-}ZF<(*`ZuA=1WreZ zg+AXFQIbxKZplZPv=bPzcGCT70Tn;aGuH8>Y(IeFae(BKkt)|V`_PpUlp42&HZt$a zCF^-;S=zV%cg2!PFi-XiG;kA4Wb(o!xZ&i<)_jJu4$FR`Q_$s}Mx6VgHFd%zo@~AI zPoi{E-jx1;NP7D!_VHZkFQN7fclq$C&O9-;nYR4MI4as)=M8Q=WieX(ReBr%-#OwB z>lfK5^Y0x!^}9S}56YQI@5IH|LwB6_vv=>i7_luhG*cIs!FX?ot71;fi>kOL>cMq! zwNm!p!c09_^6g?!hJ@o1hANN4u+85;j&GbWe5#Gbw+;s1M86CwN4@<%nv)QC>Gi~c Zlm2=6{qrSX$(BjK9?S*xV4*TM{|^{9g!2FZ diff --git a/PythonEnv/2.7/Lib/site-packages/pip/basecommand.py b/PythonEnv/2.7/Lib/site-packages/pip/basecommand.py deleted file mode 100644 index 1a22c47f2..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/basecommand.py +++ /dev/null @@ -1,207 +0,0 @@ -"""Base Command class, and related routines""" - -import os -import socket -import sys -import tempfile -import traceback -import time -import optparse - -from pip.log import logger -from pip.download import urlopen -from pip.exceptions import (BadCommand, InstallationError, UninstallationError, - CommandError) -from pip.backwardcompat import StringIO -from pip.baseparser import ConfigOptionParser, UpdatingDefaultsHelpFormatter -from pip.status_codes import SUCCESS, ERROR, UNKNOWN_ERROR, VIRTUALENV_NOT_FOUND -from pip.util import get_prog - - -__all__ = ['Command'] - - -# for backwards compatibiliy -get_proxy = urlopen.get_proxy - - -class Command(object): - name = None - usage = None - hidden = False - - def __init__(self, main_parser): - parser_kw = { - 'usage': self.usage, - 'prog': '%s %s' % (get_prog(), self.name), - 'formatter': UpdatingDefaultsHelpFormatter(), - 'add_help_option': False, - 'name': self.name, - 'description': self.__doc__, - } - self.main_parser = main_parser - 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) - - # Re-add all options and option groups. - for group in main_parser.option_groups: - self._copy_option_group(self.parser, group) - - # Copies all general options from the main parser. - self._copy_options(self.parser, main_parser.option_list) - - def _copy_options(self, parser, options): - """Populate an option parser or group with options.""" - for option in options: - if not option.dest: - continue - parser.add_option(option) - - def _copy_option_group(self, parser, group): - """Copy option group (including options) to another parser.""" - new_group = optparse.OptionGroup(parser, group.title) - self._copy_options(new_group, group.option_list) - - parser.add_option_group(new_group) - - def merge_options(self, initial_options, options): - # Make sure we have all global options carried over - attrs = ['log', 'proxy', 'require_venv', - 'log_explicit_levels', 'log_file', - 'timeout', 'default_vcs', - 'skip_requirements_regex', - 'no_input', 'exists_action', - 'cert'] - for attr in attrs: - setattr(options, attr, getattr(initial_options, attr) or getattr(options, attr)) - options.quiet += initial_options.quiet - options.verbose += initial_options.verbose - - def setup_logging(self): - pass - - def main(self, args, initial_options): - options, args = self.parser.parse_args(args) - self.merge_options(initial_options, options) - - level = 1 # Notify - level += options.verbose - level -= options.quiet - level = logger.level_for_integer(4 - level) - complete_log = [] - logger.consumers.extend( - [(level, sys.stdout), - (logger.DEBUG, complete_log.append)]) - if options.log_explicit_levels: - logger.explicit_levels = True - - self.setup_logging() - - #TODO: try to get these passing down from the command? - # without resorting to os.environ to hold these. - - 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.cert: - os.environ['PIP_CERT'] = options.cert - - if options.require_venv: - # If a venv is required check if it can really be found - if not os.environ.get('VIRTUAL_ENV'): - logger.fatal('Could not find an activated virtualenv (required).') - sys.exit(VIRTUALENV_NOT_FOUND) - - if options.log: - log_fp = open_logfile(options.log, 'a') - logger.consumers.append((logger.DEBUG, log_fp)) - else: - log_fp = None - - socket.setdefaulttimeout(options.timeout or None) - - urlopen.setup(proxystr=options.proxy, prompting=not options.no_input) - - exit = SUCCESS - store_log = False - 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): - exit = status - except (InstallationError, UninstallationError): - e = sys.exc_info()[1] - logger.fatal(str(e)) - logger.info('Exception information:\n%s' % format_exc()) - store_log = True - exit = ERROR - except BadCommand: - e = sys.exc_info()[1] - logger.fatal(str(e)) - logger.info('Exception information:\n%s' % format_exc()) - store_log = True - exit = ERROR - except CommandError: - e = sys.exc_info()[1] - logger.fatal('ERROR: %s' % e) - logger.info('Exception information:\n%s' % format_exc()) - exit = ERROR - except KeyboardInterrupt: - logger.fatal('Operation cancelled by user') - logger.info('Exception information:\n%s' % format_exc()) - store_log = True - exit = ERROR - except: - logger.fatal('Exception:\n%s' % format_exc()) - store_log = True - exit = UNKNOWN_ERROR - if log_fp is not None: - log_fp.close() - if store_log: - log_fn = options.log_file - text = '\n'.join(complete_log) - try: - log_fp = open_logfile(log_fn, 'w') - except IOError: - temp = tempfile.NamedTemporaryFile(delete=False) - log_fn = temp.name - log_fp = open_logfile(log_fn, 'w') - logger.fatal('Storing complete log in %s' % log_fn) - log_fp.write(text) - log_fp.close() - return exit - - -def format_exc(exc_info=None): - if exc_info is None: - exc_info = sys.exc_info() - out = StringIO() - traceback.print_exception(*exc_info, **dict(file=out)) - return out.getvalue() - - -def open_logfile(filename, mode='a'): - """Open the named log file in append mode. - - If the file already exists, a separator will also be printed to - the file to separate past activity from current activity. - """ - filename = os.path.expanduser(filename) - filename = os.path.abspath(filename) - dirname = os.path.dirname(filename) - if not os.path.exists(dirname): - os.makedirs(dirname) - exists = os.path.exists(filename) - - log_fp = open(filename, mode) - if exists: - log_fp.write('%s\n' % ('-' * 60)) - log_fp.write('%s run on %s\n' % (sys.argv[0], time.strftime('%c'))) - return log_fp diff --git a/PythonEnv/2.7/Lib/site-packages/pip/basecommand.pyc b/PythonEnv/2.7/Lib/site-packages/pip/basecommand.pyc deleted file mode 100644 index c1ee6759af148c855b48d2a5d89ad0ac5655df34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7170 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', ', ') - - 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 inital 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 that 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 by checking the - configuration files and environmental variables""" - - def __init__(self, *args, **kwargs): - self.config = ConfigParser.RawConfigParser() - self.name = kwargs.pop('name') - self.files = self.get_config_files() - self.config.read(self.files) - assert self.name - optparse.OptionParser.__init__(self, *args, **kwargs) - - def get_config_files(self): - config_file = os.environ.get('PIP_CONFIG_FILE', False) - if config_file and os.path.exists(config_file): - return [config_file] - return [default_config_file] - - 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).""" - # Then go and look for the other sources of configuration: - config = {} - # 1. config files - for section in ('global', self.name): - config.update(self.normalize_keys(self.get_config_section(section))) - # 2. environmental variables - config.update(self.normalize_keys(self.get_environ_vars())) - # Then set the options with those values - for key, val in config.items(): - option = self.get_option(key) - if option is not None: - # ignore empty values - if not val: - continue - # handle multiline configs - if option.action == 'append': - val = val.split() - else: - option.nargs = 1 - if option.action in ('store_true', 'store_false', 'count'): - val = strtobool(val) - try: - val = option.convert_value(key, val) - except optparse.OptionValueError: - e = sys.exc_info()[1] - print("An error occurred during configuration: %s" % e) - sys.exit(3) - defaults[option.dest] = val - return defaults - - def normalize_keys(self, items): - """Return a config dictionary with normalized keys regardless of - whether the keys were specified in environment variables or in config - files""" - normalized = {} - for key, val in items: - key = key.replace('_', '-') - if not key.startswith('--'): - key = '--%s' % key # only prefer long opts - normalized[key] = val - return normalized - - def get_config_section(self, name): - """Get a section of a configuration""" - if self.config.has_section(name): - return self.config.items(name) - return [] - - def get_environ_vars(self, prefix='PIP_'): - """Returns a generator with all environmental vars with prefix PIP_""" - for key, val in os.environ.items(): - if key.startswith(prefix): - yield (key.replace(prefix, '').lower(), val) - - def get_default_values(self): - """Overridding 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) - - 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(2, "%s\n" % msg) - - -try: - pip_dist = pkg_resources.get_distribution('pip') - version = '%s from %s (python %s)' % ( - pip_dist, pip_dist.location, sys.version[:3]) -except pkg_resources.DistributionNotFound: - # when running pip.py without installing - version = None - - -def create_main_parser(): - parser_kw = { - 'usage': '\n%prog [options]', - 'add_help_option': False, - 'formatter': UpdatingDefaultsHelpFormatter(), - 'name': 'global', - 'prog': get_prog(), - } - - parser = ConfigOptionParser(**parser_kw) - genopt = optparse.OptionGroup(parser, 'General Options') - parser.disable_interspersed_args() - - # having a default version action just causes trouble - parser.version = version - - for opt in standard_options: - genopt.add_option(opt) - parser.add_option_group(genopt) - - return parser - - -standard_options = [ - optparse.make_option( - '-h', '--help', - dest='help', - action='help', - help='Show help.'), - - optparse.make_option( - # Run only if inside a virtualenv, bail if not. - '--require-virtualenv', '--require-venv', - dest='require_venv', - action='store_true', - default=False, - help=optparse.SUPPRESS_HELP), - - optparse.make_option( - '-v', '--verbose', - dest='verbose', - action='count', - default=0, - help='Give more output. Option is additive, and can be used up to 3 times.'), - - optparse.make_option( - '-V', '--version', - dest='version', - action='store_true', - help='Show version and exit.'), - - optparse.make_option( - '-q', '--quiet', - dest='quiet', - action='count', - default=0, - help='Give less output.'), - - optparse.make_option( - '--log', - dest='log', - metavar='file', - help='Log file where a complete (maximum verbosity) record will be kept.'), - - optparse.make_option( - # Writes the log levels explicitely to the log' - '--log-explicit-levels', - dest='log_explicit_levels', - action='store_true', - default=False, - help=optparse.SUPPRESS_HELP), - - optparse.make_option( - # The default log file - '--local-log', '--log-file', - dest='log_file', - metavar='file', - default=default_log_file, - help=optparse.SUPPRESS_HELP), - - optparse.make_option( - # Don't ask for input - '--no-input', - dest='no_input', - action='store_true', - default=False, - help=optparse.SUPPRESS_HELP), - - optparse.make_option( - '--proxy', - dest='proxy', - type='str', - default='', - help="Specify a proxy in the form [user:passwd@]proxy.server:port."), - - optparse.make_option( - '--timeout', '--default-timeout', - metavar='sec', - dest='timeout', - type='float', - default=15, - help='Set the socket timeout (default %default seconds).'), - - optparse.make_option( - # The default version control system for editables, e.g. 'svn' - '--default-vcs', - dest='default_vcs', - type='str', - default='', - help=optparse.SUPPRESS_HELP), - - optparse.make_option( - # A regex to be used to skip requirements - '--skip-requirements-regex', - dest='skip_requirements_regex', - type='str', - default='', - help=optparse.SUPPRESS_HELP), - - optparse.make_option( - # Option when path already exist - '--exists-action', - dest='exists_action', - type='choice', - choices=['s', 'i', 'w', 'b'], - default=[], - action='append', - metavar='action', - help="Default action when a path already exists: " - "(s)witch, (i)gnore, (w)ipe, (b)ackup."), - - optparse.make_option( - '--cert', - dest='cert', - type='str', - default='', - metavar='path', - help = "Path to alternate CA bundle."), - - ] diff --git a/PythonEnv/2.7/Lib/site-packages/pip/baseparser.pyc b/PythonEnv/2.7/Lib/site-packages/pip/baseparser.pyc deleted file mode 100644 index ec721c362a4fda95a450eb026ed7b42f629cbaa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13258 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 IqK^On4?&MiEdT%j diff --git a/PythonEnv/2.7/Lib/site-packages/pip/cacert.pem b/PythonEnv/2.7/Lib/site-packages/pip/cacert.pem deleted file mode 100644 index 99b310bce..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/cacert.pem +++ /dev/null @@ -1,3895 +0,0 @@ -## -## ca-bundle.crt -- Bundle of CA Root Certificates -## -## Certificate data from Mozilla as of: Sat Dec 29 20:03:40 2012 -## -## This is a bundle of X.509 certificates of public Certificate Authorities -## (CA). These were automatically extracted from Mozilla's root certificates -## file (certdata.txt). This file can be found in the mozilla source tree: -## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 -## -## It contains the certificates in PEM format and therefore -## can be directly used with curl / libcurl / php_curl, or with -## an Apache+mod_ssl webserver for SSL client authentication. -## Just configure this file as the SSLCACertificateFile. -## - -# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.87 $ $Date: 2012/12/29 16:32:45 $ - -GTE CyberTrust Global Root -========================== ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg -Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG -A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz -MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL -Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 -IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u -sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql -HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID -AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW -M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF -NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -Thawte Server CA -================ ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE -AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j -b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV -BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u -c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG -A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 -ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl -/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 -1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR -MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J -GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ -GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -Thawte Premium Server CA -======================== ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE -AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl -ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU -VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 -aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ -cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 -aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh -Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ -qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm -SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf -8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t -UCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -Equifax Secure CA -================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE -ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT -B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR -fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW -8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE -CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS -spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 -zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB -BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 -70+sB3c4 ------END CERTIFICATE----- - -Digital Signature Trust Co. Global CA 1 -======================================= ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE -ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy -MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs -IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE -NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i -o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo -BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 -dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM -BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB -ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq -kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 -RbyhkwS7hp86W0N6w4pl ------END CERTIFICATE----- - -Digital Signature Trust Co. Global CA 3 -======================================= ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE -ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy -MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs -IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD -VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS -xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo -BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 -dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM -BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB -AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi -up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 -mPnHfxsb1gYgAlihw6ID ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA -TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah -WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf -Tqj/ZA1k ------END CERTIFICATE----- - -Verisign Class 1 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd -k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq -WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB -MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM -XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC -lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ ------END CERTIFICATE----- - -Verisign Class 2 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h -cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp -Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 -c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h -cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp -Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 -c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx -nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC -wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA -ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK -1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk -LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg== ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO -FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 -lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB -MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT -1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD -Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 ------END CERTIFICATE----- - -GlobalSign Root CA -================== ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx -GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds -b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV -BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD -VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa -DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc -THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb -Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP -c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX -gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF -AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj -Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG -j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH -hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC -X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -GlobalSign Root CA - R2 -======================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 -ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp -s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN -S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL -TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C -ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i -YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN -BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp -9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu -01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 -9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -ValiCert Class 1 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy -MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi -GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm -DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG -lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX -icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP -Orf1LXLI ------END CERTIFICATE----- - -ValiCert Class 2 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC -CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf -ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ -SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV -UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 -W9ViH0Pd ------END CERTIFICATE----- - -RSA Root Certificate 1 -====================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td -3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H -BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs -3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF -V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r -on+jjBXu ------END CERTIFICATE----- - -Verisign Class 1 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E -bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ -rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+ -Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB -FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N -y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 -ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h -a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc -D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== ------END CERTIFICATE----- - -Verisign Class 2 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y -azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug -b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 -c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y -aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6 -tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7 -C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS -0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs -Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0 -JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf -0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU -sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx -JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j -GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 -EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc -cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw -EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj -055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f -j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 -xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa -t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -Verisign Class 4 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS -tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM -8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW -Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX -Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt -mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd -RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG -UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- - -Entrust.net Secure Server CA -============================ ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg -cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl -ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG -A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi -eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p -dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ -aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 -gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw -ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw -CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l -dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw -NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow -HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA -BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN -Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 -n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -Entrust.net Premium 2048 Secure Server CA -========================================= ------BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u -ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp -bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV -BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx -NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 -d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u -ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL -Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr -hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW -nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi -VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC -AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER -gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B -AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo -oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS -o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z -2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX -OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== ------END CERTIFICATE----- - -Baltimore CyberTrust Root -========================= ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE -ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li -ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC -SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs -dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME -uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB -UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C -G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 -XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr -l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI -VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB -BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh -cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 -hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa -Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H -RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -Equifax Secure Global eBusiness CA -================================== ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp -bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds -b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV -PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN -qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn -hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j -BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs -MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN -I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY -NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 1 -============================= ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB -LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE -ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz -IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ -1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a -IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk -MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW -Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF -AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 -lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ -KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 2 -============================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE -ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y -MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT -DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn -2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 -BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx -JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e -uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 -jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia -78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm -V+GRMOrN ------END CERTIFICATE----- - -AddTrust Low-Value Services Root -================================ ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU -cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw -CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO -ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 -54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr -oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 -Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui -GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w -HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw -HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt -ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph -iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr -mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj -ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- - -AddTrust External Root -====================== ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD -VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw -NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU -cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg -Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 -+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw -Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo -aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy -2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 -7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL -VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk -VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl -j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 -e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u -G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -AddTrust Public Services Root -============================= ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU -cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ -BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l -dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu -nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i -d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG -Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw -HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G -A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G -A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 -JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL -+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 -Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H -EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- - -AddTrust Qualified Certificates Root -==================================== ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU -cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx -CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ -IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx -64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 -KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o -L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR -wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU -MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE -BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y -azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG -GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze -RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB -iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= ------END CERTIFICATE----- - -Entrust Root Certification Authority -==================================== ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV -BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw -b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG -A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 -MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu -MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu -Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz -A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww -Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 -j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN -rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 -MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH -hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM -Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa -v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS -W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 -tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -RSA Security 2048 v3 -==================== ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK -ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy -MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb -BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 -Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb -WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH -KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP -+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E -FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY -v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj -0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj -VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 -nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA -pKnXwiJPZ9d37CAFYd4= ------END CERTIFICATE----- - -GeoTrust Global CA -================== ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw -MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo -BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet -8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc -T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU -vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk -DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q -zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 -d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 -mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p -XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm -Mw== ------END CERTIFICATE----- - -GeoTrust Global CA 2 -==================== ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw -MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ -NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k -LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA -Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b -HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH -K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 -srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh -ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL -OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC -x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF -H4z1Ir+rzoPz4iIprn2DQKi6bA== ------END CERTIFICATE----- - -GeoTrust Universal CA -===================== ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 -MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu -Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t -JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e -RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs -7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d -8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V -qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga -Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB -Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu -KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 -ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 -XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB -hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 -qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL -oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK -xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF -KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 -DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK -xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU -p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI -P/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -GeoTrust Universal CA 2 -======================= ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 -MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg -SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 -DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 -j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q -JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a -QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 -WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP -20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn -ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC -SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG -8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 -+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E -BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ -4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ -mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq -A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg -Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP -pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d -FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp -gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm -X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -UTN-USER First-Network Applications -=================================== ------BEGIN CERTIFICATE----- -MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp -BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5 -WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T -YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB -cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug -mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj -DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu -Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi -P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE -j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w -HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j -cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G -CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y -IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK -RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp -xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq -DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE ------END CERTIFICATE----- - -America Online Root Certification Authority 1 -============================================= ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG -v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z -DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh -sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP -8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z -o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf -GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF -VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft -3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g -Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- - -America Online Root Certification Authority 2 -============================================= ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en -fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 -f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO -qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN -RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 -gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn -6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid -FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 -Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj -B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op -aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY -T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p -+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg -JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy -zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO -ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh -1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf -GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff -Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP -cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= ------END CERTIFICATE----- - -Visa eCommerce Root -=================== ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG -EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug -QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 -WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm -VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL -F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b -RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 -TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI -/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs -GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG -MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc -CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW -YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz -zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu -YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -Certum Root CA -============== ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK -ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla -Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u -by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x -wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL -kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ -89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K -Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P -NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ -GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg -GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ -0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS -qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - -Comodo AAA Services root -======================== ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw -MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl -c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV -BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG -C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs -i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW -Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH -Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK -Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f -BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl -cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz -LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm -7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z -8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C -12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -Comodo Secure Services root -=========================== ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw -MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu -Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi -BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP -9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc -rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC -oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V -p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E -FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w -gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj -YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm -aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm -4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL -DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw -pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H -RR3B7Hzs/Sk= ------END CERTIFICATE----- - -Comodo Trusted Services root -============================ ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw -MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h -bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw -IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 -3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y -/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 -juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS -ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud -DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp -ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl -cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw -uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA -BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l -R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O -9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- - -QuoVadis Root CA -================ ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE -ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz -MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp -cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD -EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk -J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL -F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL -YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen -AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w -PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y -ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 -MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj -YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs -ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW -Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu -BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw -FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 -tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo -fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul -LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x -gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi -5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi -5nrQNiOKSnQ2+Q== ------END CERTIFICATE----- - -QuoVadis Root CA 2 -================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -QuoVadis Root CA 3 -================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -Security Communication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw -8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM -DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX -5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd -DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 -JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g -0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a -mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ -s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ -6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi -FL39vmwLAw== ------END CERTIFICATE----- - -Sonera Class 1 Root CA -====================== ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG -U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw -NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh -IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88 -7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9 -EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl -0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645 -2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa -HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT -iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9 -28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV -yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR -vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P -qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z -IRlXvVWa ------END CERTIFICATE----- - -Sonera Class 2 Root CA -====================== ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG -U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw -NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh -IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 -/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT -dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG -f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P -tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH -nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT -XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt -0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI -cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph -Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx -EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH -llpwrN9M ------END CERTIFICATE----- - -Staat der Nederlanden Root CA -============================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE -ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w -HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh -bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt -vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P -jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca -C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth -vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 -22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV -HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v -dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN -BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR -EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw -MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y -nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR -iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- - -TDC Internet Root CA -==================== ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE -ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx -NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu -ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j -xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL -znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc -5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 -otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI -AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM -VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM -MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC -AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe -UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G -CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m -gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb -O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU -Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- - -TDC OCES Root CA -================ ------BEGIN CERTIFICATE----- -MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE -ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5 -MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH -nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0 -zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV -iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde -dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO -3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB -5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k -ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm -cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp -Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x -LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM -MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm -aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy -MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647 -+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6 -NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4 -A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc -A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9 -AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1 -AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw== ------END CERTIFICATE----- - -UTN DATACorp SGC Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ -BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa -MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w -HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy -dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys -raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo -wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA -9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv -33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud -DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 -BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD -LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 -DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 -I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx -EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP -DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- - -UTN USERFirst Email Root CA -=========================== ------BEGIN CERTIFICATE----- -MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0 -BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05 -OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx -FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx -ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz -dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx -B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8 -om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG -TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl -yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE -AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV -HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll -bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH -AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne -xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+ -5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV -NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ -w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= ------END CERTIFICATE----- - -UTN USERFirst Hardware Root CA -============================== ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd -BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx -OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 -eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz -ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI -wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd -tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 -i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf -Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw -gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF -lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF -UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF -BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW -XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 -lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn -iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 -nfhmqA== ------END CERTIFICATE----- - -UTN USERFirst Object Root CA -============================ ------BEGIN CERTIFICATE----- -MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb -BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz -NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx -HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy -dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR -loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ -w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu -lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7 -RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL -BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8 -ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly -c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw -DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw -NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO -PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE -qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG -hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= ------END CERTIFICATE----- - -Camerfirma Chambers of Commerce Root -==================================== ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx -NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp -cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn -MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC -AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU -xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH -NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW -DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV -d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud -EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v -cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P -AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh -bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD -VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi -fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD -L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN -UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n -ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 -erfutGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -Camerfirma Global Chambersign Root -================================== ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx -NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt -YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg -MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw -ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J -1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O -by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl -6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c -8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ -BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j -aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B -Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj -aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y -ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA -PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y -gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ -PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 -IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes -t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -NetLock Qualified (Class QA) Root -================================= ------BEGIN CERTIFICATE----- -MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn -eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0 -bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER -MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0 -LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0 -dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP -aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV -CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e -8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb -m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ -0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM -0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV -HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2 -YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh -biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p -a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz -YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg -YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg -ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov -L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr -Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0 -aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg -YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0 -IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3 -DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN -wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg -W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc -R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR -5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko ------END CERTIFICATE----- - -NetLock Notary (Class A) Root -============================= ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI -EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j -ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX -DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH -EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD -VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz -cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM -D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ -z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC -/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 -tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 -4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG -A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC -Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv -bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn -LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 -ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz -IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh -IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu -b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh -bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg -Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp -bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 -ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP -ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB -CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr -KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM -8CgHrTwXZoi1/baI ------END CERTIFICATE----- - -NetLock Business (Class B) Root -=============================== ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg -VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD -VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv -bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg -VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S -o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr -1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV -HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ -RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh -dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 -ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv -c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg -YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz -Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA -bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl -IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 -YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj -cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM -43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR -stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -NetLock Express (Class C) Root -============================== ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ -BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j -ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z -W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 -euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw -DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN -RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn -YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB -IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i -aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 -ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y -emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k -IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ -UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg -YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 -xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW -gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -XRamp Global CA Root -==================== ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE -BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj -dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx -HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg -U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu -IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx -foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE -zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs -AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry -xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap -oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC -AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc -/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n -nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz -8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -Go Daddy Class 2 CA -=================== ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY -VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG -A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g -RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD -ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv -2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 -qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j -YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY -vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O -BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o -atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu -MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim -PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt -I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI -Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b -vZ8= ------END CERTIFICATE----- - -Starfield Class 2 CA -==================== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc -U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo -MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG -A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG -SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY -bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ -JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm -epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN -F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF -MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f -hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo -bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs -afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM -PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD -KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 -QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj -YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH -AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw -Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg -U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 -LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh -cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT -dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC -AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh -3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm -vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk -fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 -fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ -EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl -1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ -lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro -g14= ------END CERTIFICATE----- - -Taiwan GRCA -=========== ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG -EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X -DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv -dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN -w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 -BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O -1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO -htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov -J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 -Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t -B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB -O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 -lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV -HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 -09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj -Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 -Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU -D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz -DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk -Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk -7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ -CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy -+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS ------END CERTIFICATE----- - -Firmaprofesional Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT -GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp -Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA -ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL -MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT -OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 -ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V -j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH -lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf -3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 -NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww -KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG -AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD -ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq -u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf -wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm -7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG -VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= ------END CERTIFICATE----- - -Wells Fargo Root CA -=================== ------BEGIN CERTIFICATE----- -MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl -bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv -MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX -x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 -E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 -OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j -sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj -YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF -BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD -ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv -m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R -OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx -x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 -tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= ------END CERTIFICATE----- - -Swisscom Root CA 1 -================== ------BEGIN CERTIFICATE----- -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 -NY6E0F/6MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- - -DigiCert Assured ID Root CA -=========================== ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw -IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx -MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL -ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO -9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy -UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW -/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy -oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf -GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF -66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq -hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc -EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn -SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i -8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -DigiCert Global Root CA -======================= ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw -HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw -MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 -dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn -TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 -BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H -4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y -7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB -o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm -8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF -BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr -EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt -tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 -UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -DigiCert High Assurance EV Root CA -================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw -KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw -MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ -MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu -Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t -Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS -OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 -MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ -NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe -h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB -Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY -JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ -V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp -myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK -mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K ------END CERTIFICATE----- - -Certplus Class 2 Primary CA -=========================== ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE -BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN -OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy -dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR -5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ -Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO -YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e -e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME -CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ -YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t -L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD -P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R -TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ -7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW -//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -DST Root CA X3 -============== ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK -ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X -DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 -cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT -rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 -UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy -xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d -utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ -MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug -dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE -GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw -RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS -fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -DST ACES CA X6 -============== ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT -MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha -MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE -CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI -DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa -pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow -GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy -MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu -Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy -dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU -CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 -5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t -Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs -vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 -oKfN5XozNmr6mis= ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 1 -============================================== ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP -MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 -acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx -MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg -U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB -TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC -aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX -yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i -Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ -8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 -W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME -BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 -sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE -q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY -nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 2 -============================================== ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP -MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg -QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN -MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr -dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G -A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls -acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe -LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI -x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g -QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr -5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB -AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt -Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 -Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ -hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P -9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 -UrbnBEI= ------END CERTIFICATE----- - -SwissSign Platinum CA - G2 -========================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -SwissSign Gold CA - G2 -====================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -SwissSign Silver CA - G2 -======================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority -======================================== ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx -CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ -cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN -b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 -nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge -RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt -tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI -hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K -Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN -NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa -Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG -1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -thawte Primary Root CA -====================== ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 -MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg -SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv -KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT -FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs -oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ -1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc -q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K -aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p -afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF -AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE -uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 -jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH -z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G5 -============================================================ ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh -dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz -j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD -Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ -Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r -fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv -Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG -SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ -X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE -KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC -Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE -ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -SecureTrust CA -============== ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy -dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe -BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX -OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t -DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH -GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b -01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH -ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj -aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu -SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf -mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ -nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -Secure Global CA -================ ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH -bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg -MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg -Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx -YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ -bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g -8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV -HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi -0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn -oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA -MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ -OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn -CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 -3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -COMODO Certification Authority -============================== ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE -BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG -A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb -MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD -T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH -+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww -xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV -4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA -1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI -rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k -b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC -AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP -OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc -IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN -+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== ------END CERTIFICATE----- - -Network Solutions Certificate Authority -======================================= ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG -EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr -IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx -MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx -jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT -aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT -crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc -/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB -AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv -bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA -A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q -4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ -GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD -ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -WellsSecure Public Root Certificate Authority -============================================= ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM -F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw -NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl -bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD -VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 -iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 -i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 -bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB -K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB -AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu -cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm -lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB -i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww -GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI -K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 -bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj -qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es -E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ -tylv2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- - -COMODO ECC Certification Authority -================================== ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC -R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE -ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix -GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X -4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni -wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG -FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA -U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -IGC/A -===== ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD -VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE -Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy -MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI -EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT -STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 -TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW -So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy -HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd -frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ -tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB -egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC -iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK -q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q -MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI -lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF -0mBWWg== ------END CERTIFICATE----- - -Security Communication EV RootCA1 -================================= ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE -BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl -Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO -/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX -WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z -ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 -bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK -9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG -SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm -iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG -Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW -mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW -T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -OISTE WISeKey Global Root GA CA -=============================== ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE -BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG -A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH -bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD -VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw -IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 -IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 -Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg -Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD -d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ -/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R -LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm -MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 -+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY -okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= ------END CERTIFICATE----- - -S-TRUST Authentication and Encryption Root CA 2005 PN -===================================================== ------BEGIN CERTIFICATE----- -MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE -BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh -cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT -LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w -NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk -ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj -aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp -b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob -4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL -g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf -eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3 -KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB -/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv -bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU -D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD -pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08 -P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA -nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit -F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b -Hz2eBIPdltkdOpQ= ------END CERTIFICATE----- - -Microsec e-Szigno Root CA -========================= ------BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE -BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL -EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 -MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz -dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT -GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG -d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N -oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc -QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ -PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb -MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG -IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD -VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 -LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A -dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA -4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg -AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA -egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 -Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO -PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv -c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h -cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw -IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT -WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV -MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER -MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp -Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal -HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT -nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE -aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK -yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB -S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= ------END CERTIFICATE----- - -Certigna -======== ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw -EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 -MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI -Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q -XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH -GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p -ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg -DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf -Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ -tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ -BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J -SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA -hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ -ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu -PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY -1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. -====================================== ------BEGIN CERTIFICATE----- -MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT -AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg -LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w -HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ -U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh -IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN -yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU -2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 -4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP -2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm -8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf -HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa -Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK -5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b -czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g -ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF -BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug -cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf -AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX -EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v -/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 -MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 -3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk -eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f -/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h -RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU -Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== ------END CERTIFICATE----- - -TC TrustCenter Class 2 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw -MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw -IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 -xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ -Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u -SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G -dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ -KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj -TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP -JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk -vQ== ------END CERTIFICATE----- - -TC TrustCenter Class 3 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw -MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W -yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo -6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ -uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk -2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE -O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 -yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 -IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal -092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc -5A== ------END CERTIFICATE----- - -TC TrustCenter Universal CA I -============================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN -MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg -VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw -JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC -qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv -xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw -ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O -gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j -BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG -1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy -vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 -ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT -ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a -7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY ------END CERTIFICATE----- - -Deutsche Telekom Root CA 2 -========================== ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT -RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG -A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 -MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G -A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS -b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 -bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI -KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY -AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK -Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV -jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV -HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr -E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy -zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 -rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G -dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -ComSign CA -========== ------BEGIN CERTIFICATE----- -MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD -EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy -MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp -Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q -ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy -P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN -GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk -YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM -rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy -oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P -AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+ -VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2 -QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI -mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb -/627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG -zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U -AGegcQCCSA== ------END CERTIFICATE----- - -ComSign Secured CA -================== ------BEGIN CERTIFICATE----- -MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE -AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w -NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD -QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs -49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH -7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB -kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 -9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw -AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t -U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA -j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC -AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a -BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp -FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP -51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz -OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== ------END CERTIFICATE----- - -Cybertrust Global Root -====================== ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li -ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 -MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD -ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW -0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL -AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin -89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT -8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 -MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G -A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO -lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi -5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 -hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T -X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -ePKI Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG -EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx -MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq -MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs -IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi -lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv -qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX -12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O -WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ -ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao -lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ -vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi -Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi -MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 -1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq -KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV -xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP -NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r -GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE -xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx -gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy -sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD -BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 -============================================================================================================================= ------BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH -DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q -aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry -b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV -BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg -S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 -MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl -IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF -n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl -IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft -dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl -cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO -Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 -xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR -6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd -BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 -N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT -y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh -LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M -dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= ------END CERTIFICATE----- - -Buypass Class 2 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 -MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M -cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 -0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 -0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R -uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV -1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt -7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 -fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w -wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho ------END CERTIFICATE----- - -Buypass Class 3 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 -MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx -ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 -n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia -AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c -1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 -pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA -EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 -htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj -el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 ------END CERTIFICATE----- - -EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 -========================================================================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -certSIGN ROOT CA -================ ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD -VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa -Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE -CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I -JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH -rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 -ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD -0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 -AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB -AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 -SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 -x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt -vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz -TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -CNNIC ROOT -========== ------BEGIN CERTIFICATE----- -MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE -ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw -OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD -o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz -VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT -VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or -czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK -y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC -wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S -lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 -Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM -O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 -BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 -G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m -mxE= ------END CERTIFICATE----- - -ApplicationCA - Japanese Government -=================================== ------BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT -SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw -MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl -cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 -fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN -wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE -jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu -nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU -WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV -BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD -vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs -o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g -/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD -io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW -dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G3 -============================================= ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz -NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo -YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT -LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j -K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE -c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C -IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu -dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr -2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 -cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE -Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s -t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -thawte Primary Root CA - G2 -=========================== ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC -VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu -IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg -Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV -MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG -b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt -IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS -LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 -8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU -mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN -G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K -rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -thawte Primary Root CA - G3 -=========================== ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w -ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD -VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG -A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At -P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC -+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY -7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW -vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ -KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK -A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC -8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm -er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G2 -============================================= ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 -OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl -b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG -BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc -KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ -EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m -ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 -npaqBA+K ------END CERTIFICATE----- - -VeriSign Universal Root Certification Authority -=============================================== ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj -1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP -MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 -9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I -AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR -tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G -CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O -a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 -Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx -Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx -P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P -wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 -mJO37M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G4 -============================================================ ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC -VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 -b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz -ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo -b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 -Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz -rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw -HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u -Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD -A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx -AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -NetLock Arany (Class Gold) Főtanúsítvány -============================================ ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G -A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 -dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB -cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx -MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO -ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 -c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu -0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw -/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk -H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw -fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 -neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW -qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta -YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna -NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu -dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -Staat der Nederlanden Root CA - G2 -================================== ------BEGIN CERTIFICATE----- -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 -66+KAQ== ------END CERTIFICATE----- - -CA Disig -======== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK -QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw -MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz -bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm -GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD -Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo -hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt -ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w -gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P -AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz -aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff -ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa -BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t -WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 -mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ -CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K -ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA -4Z7CRneC9VkGjCFMhwnN5ag= ------END CERTIFICATE----- - -Juur-SK -======= ------BEGIN CERTIFICATE----- -MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA -c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw -DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG -SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy -aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf -TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC -+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw -UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa -Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF -MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD -HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh -AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA -cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr -AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw -cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE -FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G -A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo -ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL -abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 -IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh -Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 -yyqcjg== ------END CERTIFICATE----- - -Hongkong Post Root CA 1 -======================= ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT -DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx -NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n -IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 -ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr -auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh -qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY -V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV -HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i -h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio -l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei -IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps -T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT -c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== ------END CERTIFICATE----- - -SecureSign RootCA11 -=================== ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi -SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS -b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw -KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 -cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL -TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO -wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq -g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP -O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA -bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX -t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh -OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r -bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ -Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 -y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 -lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -ACEDICOM Root -============= ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -Verisign Class 1 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAx -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0fzGVuDLDQ -VoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHiTkVWaR94AoDa3EeRKbs2 -yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFgVKTk8d6Pa -XCUDfGD67gmZPCcQcMgMCeazh88K4hiWNWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n -0a3hUKw8fGJLj7qE1xIVGx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZ -RjXZ+Hxb ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky -CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX -bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ -D/xwzoiQ ------END CERTIFICATE----- - -Microsec e-Szigno Root CA 2009 -============================== ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER -MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv -c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE -BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt -U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA -fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG -0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA -pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm -1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC -AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf -QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE -FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o -lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX -I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 -yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi -LXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi -=================================================== ------BEGIN CERTIFICATE----- -MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz -ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 -MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 -cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u -aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY -8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y -jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI -JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk -9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG -SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d -F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq -D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 -Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq -fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX ------END CERTIFICATE----- - -GlobalSign Root CA - R3 -======================= ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt -iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ -0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 -rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl -OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 -xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 -lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 -EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E -bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 -YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r -kpeDMdmztcpHWD9f ------END CERTIFICATE----- - -TC TrustCenter Universal CA III -=============================== ------BEGIN CERTIFICATE----- -MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe -Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU -QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex -KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt -QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO -juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut -CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 -M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G -A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA -g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ -KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK -BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV -CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq -woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== ------END CERTIFICATE----- - -Autoridad de Certificacion Firmaprofesional CIF A62634068 -========================================================= ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA -BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw -QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB -NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD -Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P -B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY -7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH -ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI -plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX -MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX -LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK -bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU -vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud -EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH -DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA -bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx -ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx -51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk -R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP -T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f -Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl -osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR -crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR -saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD -KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi -6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -Izenpe.com -========== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -Chambers of Commerce Root - 2008 -================================ ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy -Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl -ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF -EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl -cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA -XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj -h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ -ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk -NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g -D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 -lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ -0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 -EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI -G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ -BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh -bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh -bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC -CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH -AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 -wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH -3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU -RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 -M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 -YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF -9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK -zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG -nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ ------END CERTIFICATE----- - -Global Chambersign Root - 2008 -============================== ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx -NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg -Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ -QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf -VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf -XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 -ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB -/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA -TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M -H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe -Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF -HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB -AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT -BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE -BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm -aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm -aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp -1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 -dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG -/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 -ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s -dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg -9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH -foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du -qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr -P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq -c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -Go Daddy Root Certificate Authority - G2 -======================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu -MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G -A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq -9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD -+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd -fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl -NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 -BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac -vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r -5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV -N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 ------END CERTIFICATE----- - -Starfield Root Certificate Authority - G2 -========================================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 -eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw -DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg -VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB -dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv -W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs -bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk -N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf -ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU -JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol -TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx -4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw -F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ -c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -Starfield Services Root Certificate Authority - G2 -================================================== ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl -IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT -dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 -h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa -hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP -LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB -rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG -SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP -E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy -xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza -YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 ------END CERTIFICATE----- - -AffirmTrust Commercial -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw -MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb -DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV -C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 -BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww -MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV -HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG -hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi -qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv -0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh -sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -AffirmTrust Networking -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw -MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE -Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI -dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 -/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb -h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV -HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu -UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 -12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 -WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 -/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -AffirmTrust Premium -=================== ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy -OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy -dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn -BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV -5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs -+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd -GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R -p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI -S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 -6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 -/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo -+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv -MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC -6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S -L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK -+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV -BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg -IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 -g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb -zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== ------END CERTIFICATE----- - -AffirmTrust Premium ECC -======================= ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV -BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx -MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U -cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ -N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW -BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK -BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X -57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM -eQ== ------END CERTIFICATE----- - -Certum Trusted Network CA -========================= ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK -ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy -MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU -ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC -l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J -J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 -fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 -cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB -Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw -DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj -jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 -mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj -Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -Certinomis - Autorité Racine -============================= ------BEGIN CERTIFICATE----- -MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK -Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg -LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG -A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw -JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa -wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly -Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw -2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N -jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q -c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC -lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb -xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g -530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna -4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ -KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x -WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva -R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 -nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B -CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv -JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE -qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b -WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE -wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ -vgt2Fl43N+bYdJeimUV5 ------END CERTIFICATE----- - -Root CA Generalitat Valenciana -============================== ------BEGIN CERTIFICATE----- -MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE -ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 -IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 -WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE -CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 -F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B -ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ -D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte -JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB -AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n -dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB -ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl -AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA -YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy -AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA -aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt -AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA -YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu -AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA -OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 -dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV -BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G -A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S -b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh -TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz -Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 -NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH -iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt -+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= ------END CERTIFICATE----- - -A-Trust-nQual-03 -================ ------BEGIN CERTIFICATE----- -MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE -Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy -a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R -dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw -RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 -ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 -c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA -zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n -yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE -SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 -iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V -cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV -eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 -ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr -sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd -JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS -mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 -ahq97BvIxYSazQ== ------END CERTIFICATE----- - -TWCA Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ -VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG -EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB -IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx -QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC -oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP -4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r -y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG -9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC -mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW -QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY -T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny -Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -Security Communication RootCA2 -============================== ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC -SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy -aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ -+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R -3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV -spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K -EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 -QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj -u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk -3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q -tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 -mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -EC-ACC -====== ------BEGIN CERTIFICATE----- -MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE -BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w -ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD -VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE -CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT -BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 -MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt -SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl -Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh -cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK -w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT -ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 -HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a -E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw -0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD -VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 -Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l -dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ -lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa -Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe -l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 -E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D -5EI= ------END CERTIFICATE----- - -Hellenic Academic and Research Institutions RootCA 2011 -======================================================= ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT -O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y -aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT -AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo -IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI -1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa -71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u -8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH -3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ -MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 -MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu -b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt -XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD -/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N -7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -Actalis Authentication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM -BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE -AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky -MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz -IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ -wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa -by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 -zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f -YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 -oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l -EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 -hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 -EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 -jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY -iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI -WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 -JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx -K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ -Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC -4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo -2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz -lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem -OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 -vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -Trustis FPS Root CA -=================== ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG -EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 -IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV -BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ -RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk -H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa -cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt -o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA -AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd -BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c -GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC -yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P -8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV -l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl -iB6XzCGcKQENZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ -Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 -dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu -c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv -bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 -aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t -L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG -cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 -fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm -N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN -Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T -tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX -e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA -2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs -HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE -JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib -D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= ------END CERTIFICATE----- - -StartCom Certification Authority G2 -=================================== ------BEGIN CERTIFICATE----- -MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE -ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O -o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG -4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi -Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul -Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs -O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H -vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L -nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS -FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa -z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ -KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K -2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk -J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ -JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG -/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc -nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld -blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc -l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm -7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm -obp573PYtlNXLfbQ4ddI ------END CERTIFICATE----- - -Buypass Class 2 Root CA -======================= ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X -DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 -eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 -g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn -9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b -/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU -CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff -awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI -zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn -Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX -Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs -M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF -AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI -osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S -aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd -DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD -LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 -oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC -wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS -CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN -rJgWVqA= ------END CERTIFICATE----- - -Buypass Class 3 Root CA -======================= ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X -DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 -eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH -sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR -5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh -7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ -ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH -2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV -/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ -RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA -Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq -j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF -AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G -uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG -Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 -ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 -KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz -6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug -UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe -eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi -Cp/HuZc= ------END CERTIFICATE----- - -T-TeleSec GlobalRoot Class 3 -============================ ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM -IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU -cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx -MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz -dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD -ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK -9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU -NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF -iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W -0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr -AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb -fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT -ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h -P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== ------END CERTIFICATE----- - -EE Certification Centre Root CA -=============================== ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy -dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw -MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB -UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy -ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM -TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 -rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw -93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN -P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ -MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF -BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj -xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM -lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU -3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM -dcGWxZ0= ------END CERTIFICATE----- diff --git a/PythonEnv/2.7/Lib/site-packages/pip/cmdoptions.py b/PythonEnv/2.7/Lib/site-packages/pip/cmdoptions.py deleted file mode 100644 index 4bf910cfd..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/cmdoptions.py +++ /dev/null @@ -1,190 +0,0 @@ -"""shared options and groups""" -from optparse import make_option, OptionGroup -from pip.locations import build_prefix - - -def make_option_group(group, parser): - """ - 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 - -########### -# options # -########### - -index_url = make_option( - '-i', '--index-url', '--pypi-url', - dest='index_url', - metavar='URL', - default='https://pypi.python.org/simple/', - help='Base URL of Python Package Index (default %default).') - -extra_index_url = make_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.') - -no_index = make_option( - '--no-index', - dest='no_index', - action='store_true', - default=False, - help='Ignore package index (only looking at --find-links URLs instead).') - -find_links = make_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.") - -use_mirrors = make_option( - '-M', '--use-mirrors', - dest='use_mirrors', - action='store_true', - default=False, - help='Use the PyPI mirrors as a fallback in case the main index is down.') - -mirrors = make_option( - '--mirrors', - dest='mirrors', - metavar='URL', - action='append', - default=[], - help='Specific mirror URLs to query when --use-mirrors is used.') - -allow_external = make_option( - "--allow-external", - dest="allow_external", - action="append", - default=[], - metavar="PACKAGE", - help="Allow the installation of externally hosted files", -) - -allow_all_external = make_option( - "--allow-all-external", - dest="allow_all_external", - action="store_true", - default=True, # TODO: Change to False after 1.4 has been released - help="Allow the installation of all externally hosted files", -) - -# TODO: NOOP after 1.4 has been released -no_allow_external = make_option( - "--no-allow-external", - dest="allow_all_external", - action="store_false", - help="Disallow the installation of all externally hosted files", -) - -allow_unsafe = make_option( - "--allow-insecure", - dest="allow_insecure", - action="append", - default=[], - metavar="PACKAGE", - help="Allow the installation of insecure and unverifiable files", -) - -no_allow_unsafe = make_option( - "--no-allow-insecure", - dest="allow_all_insecure", - action="store_false", - default=True, - help="Disallow the installation of insecure and unverifiable files" -) - -requirements = make_option( - '-r', '--requirement', - dest='requirements', - action='append', - default=[], - metavar='file', - help='Install from the given requirements file. ' - 'This option can be used multiple times.') - -use_wheel = make_option( - '--use-wheel', - dest='use_wheel', - action='store_true', - help='Find and prefer wheel archives when searching indexes and find-links locations. Default to accepting source archives.') - -download_cache = make_option( - '--download-cache', - dest='download_cache', - metavar='dir', - default=None, - help='Cache downloaded packages in .') - -no_deps = make_option( - '--no-deps', '--no-dependencies', - dest='ignore_dependencies', - action='store_true', - default=False, - help="Don't install package dependencies.") - -build_dir = make_option( - '-b', '--build', '--build-dir', '--build-directory', - dest='build_dir', - metavar='dir', - default=build_prefix, - help='Directory to unpack packages into and build in. ' - 'The default in a virtualenv is "/build". ' - 'The default for global installs is "/pip_build_".') - -install_options = make_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.") - -global_options = make_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.") - -no_clean = make_option( - '--no-clean', - action='store_true', - default=False, - help="Don't clean up build directories.") - - -########## -# groups # -########## - -index_group = { - 'name': 'Package Index Options', - 'options': [ - index_url, - extra_index_url, - no_index, - find_links, - use_mirrors, - mirrors, - allow_external, - allow_all_external, - no_allow_external, - allow_unsafe, - no_allow_unsafe, - ] - } diff --git a/PythonEnv/2.7/Lib/site-packages/pip/cmdoptions.pyc b/PythonEnv/2.7/Lib/site-packages/pip/cmdoptions.pyc deleted file mode 100644 index e45e5dfeaff8d095d07e2c844fdc6bd7b29297b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4780 zcmcInYj+dJ86HW#U~@6XKrkUNahh1Ptkk3lNvLr#7>E-tjtt>c$2~f$osqQh-q@Kn z_#EmqE3ZbQ^)w;_Tl5l)NlG}cq%uYk`8T^DLvs2QPVg*qYB zoKW*ZofPVnP^X1DBh-R;+nDOkGV&~A7E8=Ip_T|a1Y01_i?_Au?g>U-VB|%ifcbzh z8kB*#1k6--o-xZpU1r#a3>%Yz09P3Nk$795?w(}uRiUmiSRSGIFs4mmWaJq}UT5TQD|{Ci^E=k%EMsm|Fbpj6K5OXju2n6HGo$*`}F5d4N&f6I0|&){2({9`FRT(HK1UEtH( ze7er&`V%|-C#G|RM^?9ENK{3V9n7wUmf4~6=U!CMoW8UY5r-;1|X zQ{80-|G=0>rTp;tW5zsTzLy#Elrh^!Fh4TpL&kKDh_u7nT@gNl;h9j+#Z8UaMNlH< z5J?an?uTFDHuwfcUlK!v`(tsl`;kyTiJj&PN~mRejNDW!87J0{BO~2N$zd92iShr9 zzh)f}dlHY(-P64s#p|bh;UPhrH3FT&qo4VK>LsZj_^&;>I#vAN!?*bs4=co*ns~!0 zy!^Hdse>k?MSXhZm3sTrw#VQ*w@Vs5qDM2qBt8m%}T zwv8Vqfo?PDkq#2`CBS!Gqa~=wcp!6?;U88}Zjo%VS&){W7BAOZhBS2?{o1DPL<4&k zyS&#M%WK$2u19&1zb1)}l(_@weY#Gp4e>7QD*3856lfVF^AVm(`E;MQDh6v67K`Fs z1WQJa;+(f7YZ@D;x@Xf&n++_th7s0>8OdfG1qU*S<2^qbO4owJ03tYnAMKf3I6pF0 zy9#Qv=LUw7v8bR#2K~4fFx(W|7Wjk{1DvA!WGDYIX=|Mr1v|^eiDY7QmO@QEL zEEF$Pdu(V-a2y!k3H>yUQ^REn>t3-ocY$~gS&7c}!SzpbuincA&|^6*F(<@1KvlJ=PvQ$?LS8lO;HjXt`3FC&4Mf*C18{K|@*ha(}^NuPd+#a@Bxoy_|mqsP>IDVY5 zX%W_`ewiUfLLFJ|7nQZ)qR2A-2%cMc49Gzmhiu6qGBJ|X3#?E}J{uwQ@*aSIkEl6P zAj%NM*hjUM)(?@xMYYF~gXq-(S9PpY zl17b6!J;a`Ge}Er<{g0xj^}Ai8n|ZSEcNu5YMC#TlR@k%$8)_=?)Gx4mv2$8L47fw z;QJndIFIQLlr4KAW&IjZ>t%i;W|dA%(J%59%D;|0AFYjo!RMmf18Tg_JT~KK)q)=9 zV#z>OVMWdA8%kxz;i;)GGrv0|?&9Q()_Hkkc0 zU`cL=0SW^{X;<$1sm;f4xH&-z&nGTIhW(9*(-fG=+h#4-j+*}c; zCQFjQ&xbmy(+1;Uf`OqFNqTV@Qh+tV9j#(dqv{@JdwXTFW4zQ)thwFJOxosl)y6cn za=j&=-W% zG;w8^@dE8e=40^5bAZ<}ON!_#qZkR)G8ce4Jgq&=e}Z%qJ-ucu2Zl3^oyu- z84oV1&oF;=uF#5-5d#|cr*U88N}O+Hk#Pr_d5vNDUPt0;XN8DROh1Vu-Jwdvx&cc? zrt=wLR_Q^*emM@Z`FM)ql9>+ QURC;YvyIv;^f>zY4<`QwcmMzZ diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/commands/__init__.py deleted file mode 100644 index e0702d270..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/commands/__init__.py +++ /dev/null @@ -1,88 +0,0 @@ -""" -Package containing all pip commands -""" - - -from pip.commands.bundle import BundleCommand -from pip.commands.completion import CompletionCommand -from pip.commands.freeze import FreezeCommand -from pip.commands.help import HelpCommand -from pip.commands.list import ListCommand -from pip.commands.search import SearchCommand -from pip.commands.show import ShowCommand -from pip.commands.install import InstallCommand -from pip.commands.uninstall import UninstallCommand -from pip.commands.unzip import UnzipCommand -from pip.commands.zip import ZipCommand -from pip.commands.wheel import WheelCommand - - -commands = { - BundleCommand.name: BundleCommand, - CompletionCommand.name: CompletionCommand, - FreezeCommand.name: FreezeCommand, - HelpCommand.name: HelpCommand, - SearchCommand.name: SearchCommand, - ShowCommand.name: ShowCommand, - InstallCommand.name: InstallCommand, - UninstallCommand.name: UninstallCommand, - UnzipCommand.name: UnzipCommand, - ZipCommand.name: ZipCommand, - ListCommand.name: ListCommand, - WheelCommand.name: WheelCommand, -} - - -commands_order = [ - InstallCommand, - UninstallCommand, - FreezeCommand, - ListCommand, - ShowCommand, - SearchCommand, - WheelCommand, - ZipCommand, - UnzipCommand, - BundleCommand, - HelpCommand, -] - - -def get_summaries(ignore_hidden=True, ordered=True): - """Yields sorted (command name, command summary) tuples.""" - - if ordered: - cmditems = _sort_commands(commands, commands_order) - else: - cmditems = commands.items() - - for name, command_class in cmditems: - if ignore_hidden and command_class.hidden: - continue - - yield (name, command_class.summary) - - -def get_similar_commands(name): - """Command name auto-correct.""" - from difflib import get_close_matches - - close_commands = get_close_matches(name, commands.keys()) - - if close_commands: - guess = close_commands[0] - else: - guess = False - - return guess - - -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/PythonEnv/2.7/Lib/site-packages/pip/commands/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/commands/__init__.pyc deleted file mode 100644 index b35b395c1b500d3fc452293c9f02624a935d147c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2808 zcmcgtTW=dh6#i!IIF94kuA8K3fnq>NuAoK&K@ma-dJ{-h6xPtd%4k{dPV8-Gcf-z@ zHdXqR3V7s&|HwN(pqw*fS8>wk*q-sZ%sF%U&ZY9-M&qALEZ5+s5N8_1P#ZpLaiffB4|3k z4z+=-g`nm5HK;bS4uX#38&H>!brEzOzYcX7*(QQb$2Xz2kZmK_cKim^6=XXIb|BIw zq{qKUSMiywf_|2&LDn2qhpan_mNp&Lf^0de1KDv@7qaW9O~_40Z9{H5ssY(>)DGm1 zrGjg0OGdO4Daj+bCmorPJ)f$M$vT2JAm8L)(!vXR!+w{M zd7q}nUKBr$CbAb7xrx#|%_qG`sor6FNTMu@@0{v%!PyryY2&(h_CG)Nkpk@3p?sgw)Pu}6Xx8dVw`_j*jzu|T;4Lr*1OJe+uV z?jdh7`>28wF#Gftjy>G{Pd6dZy7wGl$j8H6(ZuHEI;L(HKevM2Gzf{PU;oMA{ zI*DE}tY0u;Q6{o9eAm>-OdIwvO_N0CW|heK7JXh|BP5;VMJdBmORNW(xIMDOx#5T7 z!&;m9W?`%%t^1^bo%F9nC0~ptshQ5kqy04hMjezgIYo`rd~{ciXOq$1k(n0xz5Msl z$Aep=2kCgEX{VcqF2?nUqI$Hr)F=!o+)Wq`4v*{sCenoNCaKh)(5{-_0F|2PdQI=L zXp5Q`a}w~eD>UxV(6?!t7d9XhcrG9)1_)0=-y!Z|fDkV~XWXggT_w=-8cdbZCzOYM z_NlM2(^DY!qM0df#zk4m*bGi(A*UN3H&%s~VHTNqDs@UiI1Ct+Bt1A#>Db>P+UFdi z-GImPNLwK9M@mb(t-r-9c$p0f=X3E&cI{*)FCLOjI*^4V%~BPWufmicTyrkM>v&sU zO>B6C3+Du5vcSd`w?Bac>M;U;*tDahBv>8^&O&NL1jUIE!#9pE7Uo(Ns138Esl=vDo9h<112e0NpGZ?lk3Z8Ja4 zk|d3d|1Jsq_gF;(_BK{_A=&G5H0;sPj6Otrb+_Lm!k#b;lOhg7!!Z|Yy?iQ#c^LBvH?b-wYJS&__?{EFewyEN4*9r4<4r6L-y{cfyO OC?(E**Q)LITI+u+l8$=- diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/bundle.py b/PythonEnv/2.7/Lib/site-packages/pip/commands/bundle.py deleted file mode 100644 index 0b7f15093..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/commands/bundle.py +++ /dev/null @@ -1,53 +0,0 @@ -import textwrap -from pip.locations import build_prefix, src_prefix -from pip.util import display_path, backup_dir -from pip.log import logger -from pip.exceptions import InstallationError -from pip.commands.install import InstallCommand - - -class BundleCommand(InstallCommand): - """Create pybundles (archives containing multiple packages).""" - name = 'bundle' - usage = """ - %prog [options] .pybundle ...""" - summary = 'Create pybundles.' - bundle = True - - def __init__(self, *args, **kw): - super(BundleCommand, self).__init__(*args, **kw) - # bundle uses different default source and build dirs - build_opt = self.parser.get_option("--build") - build_opt.default = backup_dir(build_prefix, '-bundle') - src_opt = self.parser.get_option("--src") - src_opt.default = backup_dir(src_prefix, '-bundle') - self.parser.set_defaults(**{ - src_opt.dest: src_opt.default, - build_opt.dest: build_opt.default, - }) - - def run(self, options, args): - - deprecation = textwrap.dedent(""" - - ############################################### - ## ## - ## Due to lack of interest and maintenance, ## - ## 'pip bundle' and support for installing ## - ## from *.pybundle files is now deprecated, ## - ## and will be removed in pip v1.5. ## - ## ## - ############################################### - - """) - logger.notify(deprecation) - - if not args: - raise InstallationError('You must give a bundle filename') - # We have to get everything when creating a bundle: - options.ignore_installed = True - logger.notify('Putting temporary build files in %s and source/develop files in %s' - % (display_path(options.build_dir), display_path(options.src_dir))) - self.bundle_filename = args.pop(0) - requirement_set = super(BundleCommand, self).run(options, args) - return requirement_set diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/bundle.pyc b/PythonEnv/2.7/Lib/site-packages/pip/commands/bundle.pyc deleted file mode 100644 index 69b805eb7b9d9322400dac6cb9e9b2431bab9220..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2755 zcmcguTW=gS6h1S1Np`bo3xWuQ083HT1(8KX;#Nf!H01#ag=&ISby*nA&UiOY=Z5Xc zMM_^OMB&pg+(3kGSC${Gt+vl9`e4ftV>%%|(45O6VUkCrcKr@da zGW-RU6HR?Tq&%P^q-jV+ho&70SffLEmx>-udsOsk+V`_v%2%jZrRl04_b4AwF{J6x zkNcFbQ8A+F2;&u!BU%KMt2bg-^&#?Vxs>hr6^y?wjZN}Av8pP+(zy5X1B&*>d^+XIVgtJh5yuFyjbj(hI?+aIho+^pv5#TIB@>~MWvfgs5+oyX7-O^=XttBa@^Lb0 z?3lN5BO~*L>m+(FgUdpBZK4))`o4wW?>SN4A;y*Z>L<*B0mAT!WzC z&G6O0KciqhNZD_8gWC?8`5glJKLFs*a|{%8I4MYZ03?{3>^0{zpvM7~Fz7Kz;y%H5 zsG>07FJ=x_S*Ps}xW5Q#qg@6mM%7>d#KddN3Mj}HbXQu?0acH>430e)>|OI0QZj6- zz}Ld&i~XLl^=teuxw-kA?cGKSTZtU?DyoH0rIi}M5Fi&(psKAblQNYbh)Zm5AYa0# z>4q}^XzNN_v8Xgwava92aGC8wSA}^0qRVR1LThVO@eTMbZXMu+vO< zhKc%KV=YI^$^t=5^a-?Z!8j#ErWDtW4|3J$RDPJrLz!3g)2|g)q48A+#~D^0+asOS zjx#cu$W4G!&pl1_dB|KG$61x4&%tLcNAQio z{pcgv;4arE(HnRjG1)u9i+KABhhG}m@_{*ThQBuY0Ur3waxfb6RP;K8`|d!!P4Wt5 z$~U;XdHij|F7Ug?s@$Q+T}{qaZ?g0-.') - - cmd_opts.add_option( - '-d', '--download', '--download-dir', '--download-directory', - dest='download_dir', - metavar='dir', - default=None, - help="Download packages into instead of installing them, regardless of what's already installed.") - - cmd_opts.add_option(cmdoptions.download_cache) - - cmd_opts.add_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".') - - cmd_opts.add_option( - '-U', '--upgrade', - dest='upgrade', - action='store_true', - help='Upgrade all packages to the newest available version. ' - 'This process is recursive regardless of whether a dependency is already satisfied.') - - cmd_opts.add_option( - '--force-reinstall', - dest='force_reinstall', - action='store_true', - help='When upgrading, 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.no_deps) - - cmd_opts.add_option( - '--no-install', - dest='no_install', - action='store_true', - help="Download and unpack all packages, but don't actually install them.") - - cmd_opts.add_option( - '--no-download', - dest='no_download', - action="store_true", - help="Don't download any packages, just install the ones already downloaded " - "(completes an install run with --no-install).") - - cmd_opts.add_option(cmdoptions.install_options) - cmd_opts.add_option(cmdoptions.global_options) - - cmd_opts.add_option( - '--user', - dest='use_user_site', - action='store_true', - help='Install using the user scheme.') - - cmd_opts.add_option( - '--egg', - dest='as_egg', - action='store_true', - help="Install as self contained egg file, like easy_install does.") - - 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(cmdoptions.use_wheel) - - 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) - - 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): - """ - Create a package finder appropriate to this install command. - This method is meant to be overridden by subclasses, not - called directly. - """ - return PackageFinder(find_links=options.find_links, - index_urls=index_urls, - use_mirrors=options.use_mirrors, - mirrors=options.mirrors, - use_wheel=options.use_wheel, - allow_external=options.allow_external, - allow_insecure=options.allow_insecure, - allow_all_external=options.allow_all_external, - allow_all_insecure=options.allow_all_insecure, - allow_all_prereleases=options.pre, - ) - - def run(self, options, args): - if options.download_dir: - options.no_install = True - options.ignore_installed = True - options.build_dir = os.path.abspath(options.build_dir) - options.src_dir = os.path.abspath(options.src_dir) - install_options = options.install_options or [] - if options.use_user_site: - 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') - - temp_target_dir = None - if options.target_dir: - options.ignore_installed = True - temp_target_dir = tempfile.mkdtemp() - 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.") - install_options.append('--home=' + temp_target_dir) - - global_options = options.global_options or [] - index_urls = [options.index_url] + options.extra_index_urls - if options.no_index: - logger.notify('Ignoring indexes: %s' % ','.join(index_urls)) - index_urls = [] - - finder = self._build_package_finder(options, index_urls) - - requirement_set = RequirementSet( - build_dir=options.build_dir, - src_dir=options.src_dir, - download_dir=options.download_dir, - download_cache=options.download_cache, - upgrade=options.upgrade, - as_egg=options.as_egg, - ignore_installed=options.ignore_installed, - ignore_dependencies=options.ignore_dependencies, - force_reinstall=options.force_reinstall, - use_user_site=options.use_user_site, - target_dir=temp_target_dir) - for name in args: - requirement_set.add_requirement( - InstallRequirement.from_line(name, None)) - for name in options.editables: - requirement_set.add_requirement( - InstallRequirement.from_editable(name, default_vcs=options.default_vcs)) - for filename in options.requirements: - for req in parse_requirements(filename, finder=finder, options=options): - requirement_set.add_requirement(req) - if not requirement_set.has_requirements: - opts = {'name': self.name} - if options.find_links: - msg = ('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: - msg = ('You must give at least one requirement ' - 'to %(name)s (see "pip help %(name)s")' % opts) - logger.warn(msg) - return - - try: - if not options.no_download: - requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle) - else: - requirement_set.locate_files() - - if not options.no_install and not self.bundle: - requirement_set.install(install_options, global_options, root=options.root_path) - installed = ' '.join([req.name for req in - requirement_set.successfully_installed]) - if installed: - logger.notify('Successfully installed %s' % installed) - elif not self.bundle: - downloaded = ' '.join([req.name for req in - requirement_set.successfully_downloaded]) - if downloaded: - logger.notify('Successfully downloaded %s' % downloaded) - elif self.bundle: - requirement_set.create_bundle(self.bundle_filename) - logger.notify('Created bundle in %s' % self.bundle_filename) - except PreviousBuildDirError: - return - finally: - # Clean up - if (not options.no_clean) and ((not options.no_install) or options.download_dir): - requirement_set.cleanup_files(bundle=self.bundle) - - if options.target_dir: - if not os.path.exists(options.target_dir): - os.makedirs(options.target_dir) - lib_dir = distutils_scheme('', home=temp_target_dir)['purelib'] - for item in os.listdir(lib_dir): - shutil.move( - os.path.join(lib_dir, item), - os.path.join(options.target_dir, item) - ) - shutil.rmtree(temp_target_dir) - return requirement_set diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/install.pyc b/PythonEnv/2.7/Lib/site-packages/pip/commands/install.pyc deleted file mode 100644 index d6ef06bc67552fda452dcc7cfcfabf3b9000277b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8887 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 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/list.py b/PythonEnv/2.7/Lib/site-packages/pip/commands/list.py deleted file mode 100644 index aaae7694d..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/commands/list.py +++ /dev/null @@ -1,147 +0,0 @@ -from pip.basecommand import Command -from pip.exceptions import DistributionNotFound, BestVersionAlreadyInstalled -from pip.index import PackageFinder -from pip.log import logger -from pip.req import InstallRequirement -from pip.util import get_installed_distributions, dist_is_editable -from pip.cmdoptions import make_option_group, index_group - - -class ListCommand(Command): - """List installed packages, including editables.""" - name = 'list' - usage = """ - %prog [options]""" - summary = 'List installed packages.' - - # distributions to skip (python itself is reported by pkg_resources.working_set) - skip = ['python'] - - 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 (excluding editables)') - cmd_opts.add_option( - '-u', '--uptodate', - action='store_true', - default=False, - help='List uptodate packages (excluding editables)') - 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.') - - cmd_opts.add_option( - '--pre', - action='store_true', - default=False, - help="Include pre-release and development versions. By default, pip only finds stable versions.") - - index_opts = make_option_group(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): - """ - Create a package finder appropriate to this list command. - """ - return PackageFinder(find_links=options.find_links, - index_urls=index_urls, - use_mirrors=options.use_mirrors, - mirrors=options.mirrors, - allow_external=options.allow_external, - allow_insecure=options.allow_insecure, - allow_all_external=options.allow_all_external, - allow_all_insecure=options.allow_all_insecure, - allow_all_prereleases=options.pre, - ) - - def run(self, options, args): - if options.outdated: - self.run_outdated(options) - elif options.uptodate: - self.run_uptodate(options) - elif options.editable: - self.run_editables(options) - else: - self.run_listing(options) - - def run_outdated(self, options): - for dist, remote_version_raw, remote_version_parsed in self.find_packages_latests_versions(options): - if remote_version_parsed > dist.parsed_version: - logger.notify('%s (Current: %s Latest: %s)' % (dist.project_name, - dist.version, remote_version_raw)) - - def find_packages_latests_versions(self, options): - index_urls = [options.index_url] + options.extra_index_urls - if options.no_index: - logger.notify('Ignoring indexes: %s' % ','.join(index_urls)) - index_urls = [] - - dependency_links = [] - for dist in get_installed_distributions(local_only=options.local, skip=self.skip): - if dist.has_metadata('dependency_links.txt'): - dependency_links.extend( - dist.get_metadata_lines('dependency_links.txt'), - ) - - finder = self._build_package_finder(options, index_urls) - finder.add_dependency_links(dependency_links) - - installed_packages = get_installed_distributions(local_only=options.local, include_editables=False, skip=self.skip) - for dist in installed_packages: - req = InstallRequirement.from_line(dist.key, None) - try: - link = finder.find_requirement(req, True) - - # If link is None, means installed version is most up-to-date - if link is None: - continue - except DistributionNotFound: - continue - except BestVersionAlreadyInstalled: - remote_version = req.installed_version - else: - # It might be a good idea that link or finder had a public method - # that returned version - remote_version = finder._link_package_versions(link, req.name)[0] - remote_version_raw = remote_version[2] - remote_version_parsed = remote_version[0] - yield dist, remote_version_raw, remote_version_parsed - - def run_listing(self, options): - installed_packages = get_installed_distributions(local_only=options.local, skip=self.skip) - self.output_package_listing(installed_packages) - - def run_editables(self, options): - installed_packages = get_installed_distributions(local_only=options.local, editables_only=True) - self.output_package_listing(installed_packages) - - def output_package_listing(self, installed_packages): - installed_packages = sorted(installed_packages, key=lambda dist: dist.project_name.lower()) - for dist in installed_packages: - if dist_is_editable(dist): - line = '%s (%s, %s)' % (dist.project_name, dist.version, dist.location) - else: - line = '%s (%s)' % (dist.project_name, dist.version) - logger.notify(line) - - def run_uptodate(self, options): - uptodate = [] - for dist, remote_version_raw, remote_version_parsed in self.find_packages_latests_versions(options): - if dist.parsed_version == remote_version_parsed: - uptodate.append(dist) - self.output_package_listing(uptodate) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/list.pyc b/PythonEnv/2.7/Lib/site-packages/pip/commands/list.pyc deleted file mode 100644 index 7c38fee1312a870e2380c2e33e890e45a18c4a7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6463 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.""" - name = 'search' - usage = """ - %prog [options] """ - summary = 'Search PyPI for packages.' - - def __init__(self, *args, **kw): - super(SearchCommand, self).__init__(*args, **kw) - self.cmd_opts.add_option( - '--index', - dest='index', - metavar='URL', - default='https://pypi.python.org/pypi', - 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 - index_url = options.index - - pypi_hits = self.search(query, index_url) - 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, index_url): - pypi = xmlrpclib.ServerProxy(index_url) - 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 = {} - for hit in hits: - name = hit['name'] - summary = hit['summary'] - version = hit['version'] - score = hit['_pypi_ordering'] - if score is None: - score = 0 - - if name not in packages.keys(): - packages[name] = {'name': name, 'summary': summary, 'versions': [version], 'score': score} - 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 - packages[name]['score'] = score - - # each record has a unique name now, so we will convert the dict into a list sorted by score - package_list = sorted(packages.values(), key=lambda x: x['score'], reverse=True) - return package_list - - -def print_results(hits, name_column_width=25, terminal_width=None): - installed_packages = [p.project_name for p in pkg_resources.working_set] - for hit in hits: - name = hit['name'] - summary = hit['summary'] or '' - if terminal_width is not None: - # wrap and indent summary to fit terminal - summary = textwrap.wrap(summary, terminal_width - name_column_width - 5) - summary = ('\n' + ' ' * (name_column_width + 3)).join(summary) - line = '%s - %s' % (name.ljust(name_column_width), summary) - try: - logger.notify(line) - if name in installed_packages: - dist = pkg_resources.get_distribution(name) - logger.indent += 2 - try: - latest = highest_version(hit['versions']) - if dist.version == latest: - logger.notify('INSTALLED: %s (latest)' % dist.version) - else: - logger.notify('INSTALLED: %s' % dist.version) - logger.notify('LATEST: %s' % latest) - finally: - logger.indent -= 2 - except UnicodeEncodeError: - pass - - -def compare_versions(version1, version2): - try: - return cmp(StrictVersion(version1), StrictVersion(version2)) - # in case of abnormal version number, fall back to LooseVersion - except ValueError: - pass - try: - return cmp(LooseVersion(version1), LooseVersion(version2)) - except TypeError: - # certain LooseVersion comparions raise due to unorderable types, - # fallback to string comparison - return cmp([str(v) for v in LooseVersion(version1).version], - [str(v) for v in LooseVersion(version2).version]) - - -def highest_version(versions): - return reduce((lambda v1, v2: compare_versions(v1, v2) == 1 and v1 or v2), versions) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/search.pyc b/PythonEnv/2.7/Lib/site-packages/pip/commands/search.pyc deleted file mode 100644 index bc1154a128eadebef513ecfe249f6a5e5e676f75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5726 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 ...""" - summary = 'Show information about installed packages.' - - 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.warn('ERROR: Please provide a package name or names.') - return - query = args - - results = search_packages_info(query) - print_results(results, options.files) - - -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_packages = dict( - [(p.project_name.lower(), p) for p in pkg_resources.working_set]) - for name in query: - normalized_name = name.lower() - if normalized_name in installed_packages: - dist = installed_packages[normalized_name] - package = { - 'name': dist.project_name, - 'version': dist.version, - 'location': dist.location, - 'requires': [dep.project_name for dep in dist.requires()], - } - filelist = os.path.join( - dist.location, - dist.egg_name() + '.egg-info', - 'installed-files.txt') - if os.path.isfile(filelist): - package['files'] = filelist - yield package - - -def print_results(distributions, list_all_files): - """ - Print the informations from installed distributions found. - """ - for dist in distributions: - logger.notify("---") - logger.notify("Name: %s" % dist['name']) - logger.notify("Version: %s" % dist['version']) - logger.notify("Location: %s" % dist['location']) - logger.notify("Requires: %s" % ', '.join(dist['requires'])) - if list_all_files: - logger.notify("Files:") - if 'files' in dist: - for line in open(dist['files']): - logger.notify(" %s" % line.strip()) - else: - logger.notify("Cannot locate installed-files.txt") diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/show.pyc b/PythonEnv/2.7/Lib/site-packages/pip/commands/show.pyc deleted file mode 100644 index a1d0bf5cd9eafb4e889823d0985abb19bd3296d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3547 zcmcgv&u<%55T0E-c9JHv6xtFf)$*gnK)ez?q*YW}AZZa&l~x<65yt6iv-|9^{1#ch4(6{3Ux4XioPK_ zA^Ngaqo~F&tvW?@X-u>7jm9)KivPyndc#7~)FD>0em_W~vZIEMBb0qcYuMBO|2@M2;*QITLE*#HkjjWGB~U7$-}WljTl7%N0ho36exb&L9YPgRau9sq%U()$gJ)>&V~rL7sJ;ud)H_(Ob^# z;q*I>>$>`b|K99hHVFBE92$1OLp=Hkgu&OMBRJTmo=rz++w_dcLRYUsJscT+fD_;W zv~hNvx=scS_d3yw|$6A)6h|QE4_iaiX-GHo`9y5tUu+ zz#!z4nprfpfv0?v7fQkzsZLNNMi%aGJHML!I+m8;-PL|$FpSEwfH`@>5?Y54MYL4=$J%|VGu!Mkab6&ZFLyyDp5*~d4 zf~*B=2A`UI>UPLx^11kT6_5TH0_mWyaGLax2Ns=JWn|HPTp=9c2+_9axJsr%M^#QB zCw6#5Ya78R~)PFc&i*&+!T{;}uZj zNrjH5N0a90Xqt`9f9J-L6s_ASwyD!&Yws4}y9pNEXs|Q%9}q(Op9f&H+=-M4;zT>0 zJnK(TS_G2I8Z*!SZK*fvQSFVl7oskp-lMEb-oyvqmnRl zwO7PIg%gMxP>Iu3smcR`inTbdEhUw^=D;jMr^7rvX^3_fUDfS28KaA$D1y=uw0`Ky zt9Om#&N(tPR2X+;tGtXX(d?qJHa#TTvWA|TA-G>}FdqmmqBt}qJM4Cu8?qt~QFE9D z_p^LAPP;w`+%Nz^NIlr*kD-)g`zQ);VaR)%#XAtf*jZV;28fbu(#sG5Mk~%*F6W96 zYj&kX)_aYYGM5buv(MOnV;U!llvwpTy?k9Yw!O$!%K!@l7ljOj0S|RGKV=$Gw)Y)v?)^N{_L6AZs}sJP(Rm=7>#Sabkc2P6 z$~c+09{xYVad|1ysKkq|KvA>V)SPYW;QSTmx|ZD0oYId=v`Z)Ftq|{nA@Ze{6Ipt_ zA;7s;Zf8r5B)H}P-RBG1ieO1|&>Wt`3RiRK?XvQ#A=aI~pi24}k4xakb9U>>?ks^bCtCn9$nxpR69CyzHeJ(#qfJCKDy YZkM-;JIqg#8w}(N)`iODt20;s0nHgz+yDRo diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/uninstall.py b/PythonEnv/2.7/Lib/site-packages/pip/commands/uninstall.py deleted file mode 100644 index 388053b20..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/commands/uninstall.py +++ /dev/null @@ -1,54 +0,0 @@ -from pip.req import InstallRequirement, RequirementSet, parse_requirements -from pip.basecommand import Command -from pip.exceptions import InstallationError - - -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): - requirement_set = RequirementSet( - build_dir=None, - src_dir=None, - download_dir=None) - for name in args: - requirement_set.add_requirement( - InstallRequirement.from_line(name)) - for filename in options.requirements: - for req in parse_requirements(filename, options=options): - requirement_set.add_requirement(req) - if not requirement_set.has_requirements: - raise InstallationError('You must give at least one requirement ' - 'to %(name)s (see "pip help %(name)s")' % dict(name=self.name)) - requirement_set.uninstall(auto_confirm=options.yes) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/uninstall.pyc b/PythonEnv/2.7/Lib/site-packages/pip/commands/uninstall.pyc deleted file mode 100644 index 1f154572d21bc4286e27e456cbfe2ad9b6901035..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2743 zcmc&$%Z?jG6uoVa?aU;TOcDr03aAt%iX&kQWrGx=2*PB6h=!<#Fp6>1)9xzUHR)HX zs^=liYzP}R?Dz-%g5P1!2f(@29=nCI4z{~okNd29&b8ZrZ*KhlS1U|t@oMAyD?Ii` z3=*G!Qlc!NQ9xOXMlH(PG-^}8XDv$CDC^LuQ?J{Ub}8%8sE73$sSZs8k{$Ym=q=I9 z(FKxS+U@sXTK|JrpS`(j7{1M|i_gwnXXHCtBZ>Sw zg!GWrsJloH8Hc<5F6%yll?{Q{(v2wN4gw)nmPN#OM)i89V-CXSNmnUvsu#7{+i6R*Uh z#qB;8!(pu}#D8T5Mm%al#s}^d>~&avN2Lg6?&-ZxjuNWLY0i6QQEjnn?DdsKu zjVQp@L7NVM4nPKY0a!2xOaPD`&A=64f1Tt8$%|0#G!!n8-1G{Uy}}hQv<0EI7wXUf zY+Plh@BqKeyxl&NX2-TL4vgg(2ZKg}ZVfw9S?4Zc(m1e=F&Za~qI!zrCv6)%N#e03!$4Gv#F=q1Ncm}pslkuL;zfPw{ z$;ND=^YONtRI~AO&*i82;rPMui}5o(8C&ht;Jnj}(PPF*-45+|$s@2nWaQkyV{c)g z;AXIncX#pbwa!<)R>D`!ZPm9{eA_=UfC7whjDR^tAf3B=`>ajJcbE>_uWr%V8l8d; zEke0KiqkcE8}KK1bDQ>#zhvSZbRhXToptE=9s!D{zNg~gZ4hj~x=v@<@+MBZwWgxI zH_vE~H+y9N;1Ypg=o8==lVbx>1UKO1=YVqZ$`_e@?CTPr)x_b#?)dI9sdOqMsf|ax zHHn`yVI;b3TEwfvMYFNbaQL#QfKoJS2Dd;HM8CwUKu>G{otx#|ejaD)z7>6|l(@}p zpDDE5zkT0>frUIz;xQ(Z^er>1EQ1GDwZ9~+<1H|K~ wh6Gock0!BIi~bOD>HOaI^KIqrAW8KaLUt*hmfJ6>z15p$mL(e;u45MHb z5Fnalj0A{mFCwnZzueIVW+je(Q|$jAM;z4bEB+0 zTjJO LGpE|PyXl8NkS~)l diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/wheel.py b/PythonEnv/2.7/Lib/site-packages/pip/commands/wheel.py deleted file mode 100644 index 5bf1c2333..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/commands/wheel.py +++ /dev/null @@ -1,158 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import absolute_import - -import os -import sys -from pip.basecommand import Command -from pip.index import PackageFinder -from pip.log import logger -from pip.exceptions import CommandError, PreviousBuildDirError -from pip.req import InstallRequirement, RequirementSet, parse_requirements -from pip.util import normalize_path -from pip.wheel import WheelBuilder, wheel_setuptools_support, setuptools_requirement -from pip import cmdoptions - -DEFAULT_WHEEL_DIR = os.path.join(normalize_path(os.curdir), 'wheelhouse') - -class WheelCommand(Command): - """ - 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: http://wheel.readthedocs.org/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] ... - %prog [options] ... - %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=DEFAULT_WHEEL_DIR, - help="Build wheels into , where the default is '/wheelhouse'.") - cmd_opts.add_option(cmdoptions.use_wheel) - 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.requirements) - cmd_opts.add_option(cmdoptions.download_cache) - cmd_opts.add_option(cmdoptions.no_deps) - cmd_opts.add_option(cmdoptions.build_dir) - - 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) - - 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): - - # confirm requirements - try: - import wheel.bdist_wheel - except ImportError: - raise CommandError("'pip wheel' requires bdist_wheel from the 'wheel' distribution.") - if not wheel_setuptools_support(): - raise CommandError("'pip wheel' requires %s." % setuptools_requirement) - - index_urls = [options.index_url] + options.extra_index_urls - if options.no_index: - logger.notify('Ignoring indexes: %s' % ','.join(index_urls)) - index_urls = [] - - finder = PackageFinder(find_links=options.find_links, - index_urls=index_urls, - use_mirrors=options.use_mirrors, - mirrors=options.mirrors, - use_wheel=options.use_wheel, - allow_external=options.allow_external, - allow_insecure=options.allow_insecure, - allow_all_external=options.allow_all_external, - allow_all_insecure=options.allow_all_insecure, - allow_all_prereleases=options.pre, - ) - - options.build_dir = os.path.abspath(options.build_dir) - requirement_set = RequirementSet( - build_dir=options.build_dir, - src_dir=None, - download_dir=None, - download_cache=options.download_cache, - ignore_dependencies=options.ignore_dependencies, - ignore_installed=True) - - #parse args and/or requirements files - for name in args: - if name.endswith(".whl"): - logger.notify("ignoring %s" % name) - continue - requirement_set.add_requirement( - InstallRequirement.from_line(name, None)) - - for filename in options.requirements: - for req in parse_requirements(filename, finder=finder, options=options): - if req.editable or (req.name is None and req.url.endswith(".whl")): - logger.notify("ignoring %s" % req.url) - continue - requirement_set.add_requirement(req) - - #fail if no requirements - if not requirement_set.has_requirements: - opts = {'name': self.name} - msg = ('You must give at least one requirement ' - 'to %(name)s (see "pip help %(name)s")' % opts) - logger.error(msg) - return - - try: - #build wheels - wb = WheelBuilder( - requirement_set, - finder, - options.wheel_dir, - build_options = options.build_options or [], - global_options = options.global_options or [] - ) - wb.build() - except PreviousBuildDirError: - return - finally: - if not options.no_clean: - requirement_set.cleanup_files() - diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/wheel.pyc b/PythonEnv/2.7/Lib/site-packages/pip/commands/wheel.pyc deleted file mode 100644 index 7e8c33da4a4cfc29d43a3cc250c185a66cc3b97c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5527 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 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/zip.py b/PythonEnv/2.7/Lib/site-packages/pip/commands/zip.py deleted file mode 100644 index 11ac91984..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/commands/zip.py +++ /dev/null @@ -1,348 +0,0 @@ -import sys -import re -import fnmatch -import os -import shutil -import zipfile -from pip.util import display_path, backup_dir, rmtree -from pip.log import logger -from pip.exceptions import InstallationError -from pip.basecommand import Command - - -class ZipCommand(Command): - """Zip individual packages.""" - name = 'zip' - usage = """ - %prog [options] ...""" - summary = 'Zip individual packages.' - - def __init__(self, *args, **kw): - super(ZipCommand, self).__init__(*args, **kw) - if self.name == 'zip': - self.cmd_opts.add_option( - '--unzip', - action='store_true', - dest='unzip', - help='Unzip (rather than zip) a package.') - else: - self.cmd_opts.add_option( - '--zip', - action='store_false', - dest='unzip', - default=True, - help='Zip (rather than unzip) a package.') - self.cmd_opts.add_option( - '--no-pyc', - action='store_true', - dest='no_pyc', - help='Do not include .pyc files in zip files (useful on Google App Engine).') - self.cmd_opts.add_option( - '-l', '--list', - action='store_true', - dest='list', - help='List the packages available, and their zip status.') - self.cmd_opts.add_option( - '--sort-files', - action='store_true', - dest='sort_files', - help='With --list, sort packages according to how many files they contain.') - self.cmd_opts.add_option( - '--path', - action='append', - dest='paths', - help='Restrict operations to the given paths (may include wildcards).') - self.cmd_opts.add_option( - '-n', '--simulate', - action='store_true', - help='Do not actually perform the zip/unzip operation.') - - self.parser.insert_option_group(0, self.cmd_opts) - - def paths(self): - """All the entries of sys.path, possibly restricted by --path""" - if not self.select_paths: - return sys.path - result = [] - match_any = set() - for path in sys.path: - path = os.path.normcase(os.path.abspath(path)) - for match in self.select_paths: - match = os.path.normcase(os.path.abspath(match)) - if '*' in match: - if re.search(fnmatch.translate(match + '*'), path): - result.append(path) - match_any.add(match) - break - else: - if path.startswith(match): - result.append(path) - match_any.add(match) - break - else: - logger.debug("Skipping path %s because it doesn't match %s" - % (path, ', '.join(self.select_paths))) - for match in self.select_paths: - if match not in match_any and '*' not in match: - result.append(match) - logger.debug("Adding path %s because it doesn't match " - "anything already on sys.path" % match) - return result - - def run(self, options, args): - self.select_paths = options.paths - self.simulate = options.simulate - if options.list: - return self.list(options, args) - if not args: - raise InstallationError( - 'You must give at least one package to zip or unzip') - packages = [] - for arg in args: - module_name, filename = self.find_package(arg) - if options.unzip and os.path.isdir(filename): - raise InstallationError( - 'The module %s (in %s) is not a zip file; cannot be unzipped' - % (module_name, filename)) - elif not options.unzip and not os.path.isdir(filename): - raise InstallationError( - 'The module %s (in %s) is not a directory; cannot be zipped' - % (module_name, filename)) - packages.append((module_name, filename)) - last_status = None - for module_name, filename in packages: - if options.unzip: - last_status = self.unzip_package(module_name, filename) - else: - last_status = self.zip_package(module_name, filename, options.no_pyc) - return last_status - - def unzip_package(self, module_name, filename): - zip_filename = os.path.dirname(filename) - if not os.path.isfile(zip_filename) and zipfile.is_zipfile(zip_filename): - raise InstallationError( - 'Module %s (in %s) isn\'t located in a zip file in %s' - % (module_name, filename, zip_filename)) - package_path = os.path.dirname(zip_filename) - if not package_path in self.paths(): - logger.warn( - 'Unpacking %s into %s, but %s is not on sys.path' - % (display_path(zip_filename), display_path(package_path), - display_path(package_path))) - logger.notify('Unzipping %s (in %s)' % (module_name, display_path(zip_filename))) - if self.simulate: - logger.notify('Skipping remaining operations because of --simulate') - return - logger.indent += 2 - try: - ## FIXME: this should be undoable: - zip = zipfile.ZipFile(zip_filename) - to_save = [] - for info in zip.infolist(): - name = info.filename - if name.startswith(module_name + os.path.sep): - content = zip.read(name) - dest = os.path.join(package_path, name) - if not os.path.exists(os.path.dirname(dest)): - os.makedirs(os.path.dirname(dest)) - if not content and dest.endswith(os.path.sep): - if not os.path.exists(dest): - os.makedirs(dest) - else: - f = open(dest, 'wb') - f.write(content) - f.close() - else: - to_save.append((name, zip.read(name))) - zip.close() - if not to_save: - logger.info('Removing now-empty zip file %s' % display_path(zip_filename)) - os.unlink(zip_filename) - self.remove_filename_from_pth(zip_filename) - else: - logger.info('Removing entries in %s/ from zip file %s' % (module_name, display_path(zip_filename))) - zip = zipfile.ZipFile(zip_filename, 'w') - for name, content in to_save: - zip.writestr(name, content) - zip.close() - finally: - logger.indent -= 2 - - def zip_package(self, module_name, filename, no_pyc): - orig_filename = filename - logger.notify('Zip %s (in %s)' % (module_name, display_path(filename))) - logger.indent += 2 - if filename.endswith('.egg'): - dest_filename = filename - else: - dest_filename = filename + '.zip' - try: - ## FIXME: I think this needs to be undoable: - if filename == dest_filename: - filename = backup_dir(orig_filename) - logger.notify('Moving %s aside to %s' % (orig_filename, filename)) - if not self.simulate: - shutil.move(orig_filename, filename) - try: - logger.info('Creating zip file in %s' % display_path(dest_filename)) - if not self.simulate: - zip = zipfile.ZipFile(dest_filename, 'w') - zip.writestr(module_name + '/', '') - for dirpath, dirnames, filenames in os.walk(filename): - if no_pyc: - filenames = [f for f in filenames - if not f.lower().endswith('.pyc')] - for fns, is_dir in [(dirnames, True), (filenames, False)]: - for fn in fns: - full = os.path.join(dirpath, fn) - dest = os.path.join(module_name, dirpath[len(filename):].lstrip(os.path.sep), fn) - if is_dir: - zip.writestr(dest + '/', '') - else: - zip.write(full, dest) - zip.close() - logger.info('Removing old directory %s' % display_path(filename)) - if not self.simulate: - rmtree(filename) - except: - ## FIXME: need to do an undo here - raise - ## FIXME: should also be undone: - self.add_filename_to_pth(dest_filename) - finally: - logger.indent -= 2 - - def remove_filename_from_pth(self, filename): - for pth in self.pth_files(): - f = open(pth, 'r') - lines = f.readlines() - f.close() - new_lines = [ - l for l in lines if l.strip() != filename] - if lines != new_lines: - logger.info('Removing reference to %s from .pth file %s' - % (display_path(filename), display_path(pth))) - if not [line for line in new_lines if line]: - logger.info('%s file would be empty: deleting' % display_path(pth)) - if not self.simulate: - os.unlink(pth) - else: - if not self.simulate: - f = open(pth, 'wb') - f.writelines(new_lines) - f.close() - return - logger.warn('Cannot find a reference to %s in any .pth file' % display_path(filename)) - - def add_filename_to_pth(self, filename): - path = os.path.dirname(filename) - dest = filename + '.pth' - if path not in self.paths(): - logger.warn('Adding .pth file %s, but it is not on sys.path' % display_path(dest)) - if not self.simulate: - if os.path.exists(dest): - f = open(dest) - lines = f.readlines() - f.close() - if lines and not lines[-1].endswith('\n'): - lines[-1] += '\n' - lines.append(filename + '\n') - else: - lines = [filename + '\n'] - f = open(dest, 'wb') - f.writelines(lines) - f.close() - - def pth_files(self): - for path in self.paths(): - if not os.path.exists(path) or not os.path.isdir(path): - continue - for filename in os.listdir(path): - if filename.endswith('.pth'): - yield os.path.join(path, filename) - - def find_package(self, package): - for path in self.paths(): - full = os.path.join(path, package) - if os.path.exists(full): - return package, full - if not os.path.isdir(path) and zipfile.is_zipfile(path): - zip = zipfile.ZipFile(path, 'r') - try: - zip.read(os.path.join(package, '__init__.py')) - except KeyError: - pass - else: - zip.close() - return package, full - zip.close() - ## FIXME: need special error for package.py case: - raise InstallationError( - 'No package with the name %s found' % package) - - def list(self, options, args): - if args: - raise InstallationError( - 'You cannot give an argument with --list') - for path in sorted(self.paths()): - if not os.path.exists(path): - continue - basename = os.path.basename(path.rstrip(os.path.sep)) - if os.path.isfile(path) and zipfile.is_zipfile(path): - if os.path.dirname(path) not in self.paths(): - logger.notify('Zipped egg: %s' % display_path(path)) - continue - if (basename != 'site-packages' and basename != 'dist-packages' - and not path.replace('\\', '/').endswith('lib/python')): - continue - logger.notify('In %s:' % display_path(path)) - logger.indent += 2 - zipped = [] - unzipped = [] - try: - for filename in sorted(os.listdir(path)): - ext = os.path.splitext(filename)[1].lower() - if ext in ('.pth', '.egg-info', '.egg-link'): - continue - if ext == '.py': - logger.info('Not displaying %s: not a package' % display_path(filename)) - continue - full = os.path.join(path, filename) - if os.path.isdir(full): - unzipped.append((filename, self.count_package(full))) - elif zipfile.is_zipfile(full): - zipped.append(filename) - else: - logger.info('Unknown file: %s' % display_path(filename)) - if zipped: - logger.notify('Zipped packages:') - logger.indent += 2 - try: - for filename in zipped: - logger.notify(filename) - finally: - logger.indent -= 2 - else: - logger.notify('No zipped packages.') - if unzipped: - if options.sort_files: - unzipped.sort(key=lambda x: -x[1]) - logger.notify('Unzipped packages:') - logger.indent += 2 - try: - for filename, count in unzipped: - logger.notify('%s (%i files)' % (filename, count)) - finally: - logger.indent -= 2 - else: - logger.notify('No unzipped packages.') - finally: - logger.indent -= 2 - - def count_package(self, path): - total = 0 - for dirpath, dirnames, filenames in os.walk(path): - filenames = [f for f in filenames - if not f.lower().endswith('.pyc')] - total += len(filenames) - return total diff --git a/PythonEnv/2.7/Lib/site-packages/pip/commands/zip.pyc b/PythonEnv/2.7/Lib/site-packages/pip/commands/zip.pyc deleted file mode 100644 index 9c3e176d2fc464de4ae6a395fffbcae93c5a5d4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12107 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 py2.5 - if hasattr(self, 'timeout'): - self.connection_kwargs.update(timeout = self.timeout) - - # for >= py2.7 - if hasattr(self, 'source_address'): - self.connection_kwargs.update(source_address = self.source_address) - - sock = socket.create_connection((self.host, self.port), **self.connection_kwargs) - - # for >= py2.7 - if getattr(self, '_tunnel_host', None): - self.sock = sock - self._tunnel() - - # get alternate bundle or use our included bundle - cert_path = os.environ.get('PIP_CERT', '') or default_cert_path - - self.sock = ssl.wrap_socket(sock, - self.key_file, - self.cert_file, - cert_reqs=ssl.CERT_REQUIRED, - ca_certs=cert_path) - - try: - match_hostname(self.sock.getpeercert(), self.host) - except CertificateError: - self.sock.shutdown(socket.SHUT_RDWR) - self.sock.close() - raise - - - -class VerifiedHTTPSHandler(urllib2.HTTPSHandler): - """ - A HTTPSHandler that uses our own VerifiedHTTPSConnection. - """ - def __init__(self, connection_class = VerifiedHTTPSConnection): - self.specialized_conn_class = connection_class - urllib2.HTTPSHandler.__init__(self) - def https_open(self, req): - return self.do_open(self.specialized_conn_class, req) - - -class URLOpener(object): - """ - pip's own URL helper that adds HTTP auth and proxy support - """ - def __init__(self): - self.passman = urllib2.HTTPPasswordMgrWithDefaultRealm() - self.proxy_handler = None - - def __call__(self, url): - """ - If the given url contains auth info or if a normal request gets a 401 - response, an attempt is made to fetch the resource using basic HTTP - auth. - - """ - url, username, password, scheme = self.extract_credentials(url) - if username is None: - try: - response = self.get_opener(scheme=scheme).open(url) - except urllib2.HTTPError: - e = sys.exc_info()[1] - if e.code != 401: - raise - response = self.get_response(url) - else: - response = self.get_response(url, username, password) - return response - - def get_request(self, url): - """ - Wraps the URL to retrieve to protects against "creative" - interpretation of the RFC: http://bugs.python.org/issue8732 - """ - if isinstance(url, string_types): - url = urllib2.Request(url, headers={'Accept-encoding': 'identity'}) - return url - - def get_response(self, url, username=None, password=None): - """ - does the dirty work of actually getting the rsponse object using urllib2 - and its HTTP auth builtins. - """ - scheme, netloc, path, query, frag = urlparse.urlsplit(url) - req = self.get_request(url) - - stored_username, stored_password = self.passman.find_user_password(None, netloc) - # see if we have a password stored - if stored_username is None: - if username is None and self.prompting: - username = urllib.quote(raw_input('User for %s: ' % netloc)) - password = urllib.quote(getpass.getpass('Password: ')) - if username and password: - self.passman.add_password(None, netloc, username, password) - stored_username, stored_password = self.passman.find_user_password(None, netloc) - authhandler = urllib2.HTTPBasicAuthHandler(self.passman) - opener = self.get_opener(authhandler, scheme=scheme) - # FIXME: should catch a 401 and offer to let the user reenter credentials - return opener.open(req) - - def get_opener(self, *args, **kwargs): - """ - Build an OpenerDirector instance based on the scheme and proxy option - """ - - args = list(args) - if self.proxy_handler: - args.extend([self.proxy_handler, urllib2.CacheFTPHandler]) - - if kwargs.get('scheme') == 'https': - https_handler = VerifiedHTTPSHandler() - director = urllib2.build_opener(https_handler, *args) - #strip out HTTPHandler to prevent MITM spoof - for handler in director.handlers: - if isinstance(handler, urllib2.HTTPHandler): - director.handlers.remove(handler) - else: - director = urllib2.build_opener(*args) - - # Add our new headers to the opener - headers = [x for x in director.addheaders if x[0].lower() != "user-agent"] - headers.append(("User-agent", build_user_agent())) - director.addheaders = headers - - return director - - def setup(self, proxystr='', prompting=True): - """ - Sets the proxy handler given the option passed on the command - line. If an empty string is passed it looks at the HTTP_PROXY - environment variable. - """ - self.prompting = prompting - proxy = self.get_proxy(proxystr) - if proxy: - self.proxy_handler = urllib2.ProxyHandler({"http": proxy, "ftp": proxy, "https": proxy}) - - def parse_credentials(self, netloc): - if "@" in netloc: - userinfo = netloc.rsplit("@", 1)[0] - if ":" in userinfo: - return userinfo.split(":", 1) - return userinfo, None - return None, None - - def extract_credentials(self, url): - """ - Extracts user/password from a url. - - Returns a tuple: - (url-without-auth, username, password) - """ - if isinstance(url, urllib2.Request): - result = urlparse.urlsplit(url.get_full_url()) - else: - result = urlparse.urlsplit(url) - scheme, netloc, path, query, frag = result - - username, password = self.parse_credentials(netloc) - if username is None: - return url, None, None, scheme - elif password is None and self.prompting: - # remove the auth credentials from the url part - netloc = netloc.replace('%s@' % username, '', 1) - # prompt for the password - prompt = 'Password for %s@%s: ' % (username, netloc) - password = urllib.quote(getpass.getpass(prompt)) - else: - # remove the auth credentials from the url part - netloc = netloc.replace('%s:%s@' % (username, password), '', 1) - - target_url = urlparse.urlunsplit((scheme, netloc, path, query, frag)) - return target_url, username, password, scheme - - def get_proxy(self, proxystr=''): - """ - Get the proxy given the option passed on the command line. - If an empty string is passed it looks at the HTTP_PROXY - environment variable. - """ - if not proxystr: - proxystr = os.environ.get('HTTP_PROXY', '') - if proxystr: - if '@' in proxystr: - user_password, server_port = proxystr.split('@', 1) - if ':' in user_password: - user, password = user_password.split(':', 1) - else: - user = user_password - prompt = 'Password for %s@%s: ' % (user, server_port) - password = urllib.quote(getpass.getpass(prompt)) - return '%s:%s@%s' % (user, password, server_port) - else: - return proxystr - else: - return None - -urlopen = URLOpener() - - -def is_url(name): - """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): - """ - Convert a file: URL to a path. - """ - assert url.startswith('file:'), ( - "You can only turn file: urls into filenames (not %r)" % url) - path = url[len('file:'):].lstrip('/') - path = urllib.unquote(path) - if _url_drive_re.match(path): - path = path[0] + ':' + path[2:] - else: - path = '/' + path - return path - - -_drive_re = re.compile('^([a-z]):', re.I) -_url_drive_re = re.compile('^([a-z])[:|]', re.I) - - -def path_to_url(path): - """ - Convert a path to a file: URL. The path will be made absolute. - """ - path = os.path.normcase(os.path.abspath(path)) - if _drive_re.match(path): - path = path[0] + '|' + path[2:] - url = urllib.quote(path) - url = url.replace(os.path.sep, '/') - url = url.lstrip('/') - return 'file:///' + url - - -def path_to_url2(path): - """ - 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)) - drive, path = os.path.splitdrive(path) - filepath = path.split(os.path.sep) - url = '/'.join([urllib.quote(part) for part in filepath]) - if not drive: - url = url.lstrip('/') - return 'file:///' + drive + url - - -def geturl(urllib2_resp): - """ - Use instead of urllib.addinfourl.geturl(), which appears to have - some issues with dropping the double slash for certain schemes - (e.g. file://). This implementation is probably over-eager, as it - always restores '://' if it is missing, and it appears some url - schemata aren't always followed by '//' after the colon, but as - far as I know pip doesn't need any of those. - The URI RFC can be found at: http://tools.ietf.org/html/rfc1630 - - This function assumes that - scheme:/foo/bar - is the same as - scheme:///foo/bar - """ - url = urllib2_resp.geturl() - scheme, rest = url.split(':', 1) - if rest.startswith('//'): - return url - else: - # FIXME: write a good test to cover it - return '%s://%s' % (scheme, rest) - - -def is_archive_file(name): - """Return True if `name` is a considered as an archive file.""" - archives = ('.zip', '.tar.gz', '.tar.bz2', '.tgz', '.tar', '.pybundle', - '.whl') - ext = splitext(name)[1].lower() - if ext in archives: - return True - return False - - -def unpack_vcs_link(link, location, only_download=False): - vcs_backend = _get_used_vcs_backend(link) - if only_download: - vcs_backend.export(location) - else: - vcs_backend.unpack(location) - - -def unpack_file_url(link, location): - source = url_to_path(link.url) - content_type = mimetypes.guess_type(source)[0] - if os.path.isdir(source): - # delete the location since shutil will create it again :( - if os.path.isdir(location): - rmtree(location) - shutil.copytree(source, location) - else: - unpack_file(source, location, content_type, link) - - -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): - return bool(_get_used_vcs_backend(link)) - - -def is_file_url(link): - return link.url.lower().startswith('file:') - - -def _check_hash(download_hash, link): - if download_hash.digest_size != hashlib.new(link.hash_name).digest_size: - logger.fatal("Hash digest size of the package %d (%s) doesn't match the expected hash name %s!" - % (download_hash.digest_size, link, link.hash_name)) - raise HashMismatch('Hash name mismatch for package %s' % link) - if download_hash.hexdigest() != link.hash: - logger.fatal("Hash of the package %s (%s) doesn't match the expected hash %s!" - % (link, download_hash.hexdigest(), link.hash)) - raise HashMismatch('Bad %s hash for package %s' % (link.hash_name, link)) - - -def _get_hash_from_file(target_file, link): - try: - download_hash = hashlib.new(link.hash_name) - except (ValueError, TypeError): - logger.warn("Unsupported hash name %s for package %s" % (link.hash_name, link)) - return None - - fp = open(target_file, 'rb') - while True: - chunk = fp.read(4096) - if not chunk: - break - download_hash.update(chunk) - fp.close() - return download_hash - - -def _download_url(resp, link, temp_location): - fp = open(temp_location, 'wb') - download_hash = None - if link.hash and link.hash_name: - try: - download_hash = hashlib.new(link.hash_name) - except ValueError: - logger.warn("Unsupported hash name %s for package %s" % (link.hash_name, link)) - try: - total_length = int(resp.info()['content-length']) - except (ValueError, KeyError, TypeError): - total_length = 0 - downloaded = 0 - show_progress = total_length > 40 * 1000 or not total_length - show_url = link.show_url - try: - if show_progress: - ## FIXME: the URL can get really long in this message: - if total_length: - logger.start_progress('Downloading %s (%s): ' % (show_url, format_size(total_length))) - else: - logger.start_progress('Downloading %s (unknown size): ' % show_url) - else: - logger.notify('Downloading %s' % show_url) - logger.info('Downloading from URL %s' % link) - - while True: - chunk = resp.read(4096) - if not chunk: - break - downloaded += len(chunk) - if show_progress: - if not total_length: - logger.show_progress('%s' % format_size(downloaded)) - else: - logger.show_progress('%3i%% %s' % (100 * downloaded / total_length, format_size(downloaded))) - if download_hash is not None: - download_hash.update(chunk) - fp.write(chunk) - fp.close() - finally: - if show_progress: - logger.end_progress('%s downloaded' % format_size(downloaded)) - return download_hash - - -def _copy_file(filename, location, content_type, 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 ' % - display_path(download_location), ('i', 'w', 'b')) - if response == 'i': - copy = False - elif response == 'w': - logger.warn('Deleting %s' % display_path(download_location)) - os.remove(download_location) - elif response == 'b': - dest_file = backup_dir(download_location) - logger.warn('Backing up %s to %s' - % (display_path(download_location), display_path(dest_file))) - shutil.move(download_location, dest_file) - if copy: - shutil.copy(filename, download_location) - logger.indent -= 2 - logger.notify('Saved %s' % display_path(download_location)) - - -def unpack_http_url(link, location, download_cache, download_dir=None): - temp_dir = tempfile.mkdtemp('-unpack', 'pip-') - temp_location = None - target_url = link.url.split('#', 1)[0] - - already_cached = False - cache_file = None - cache_content_type_file = None - download_hash = None - if download_cache: - cache_file = os.path.join(download_cache, - urllib.quote(target_url, '')) - cache_content_type_file = cache_file + '.content-type' - already_cached = ( - os.path.exists(cache_file) and - os.path.exists(cache_content_type_file) - ) - if not os.path.isdir(download_cache): - create_download_cache_folder(download_cache) - - already_downloaded = None - if download_dir: - already_downloaded = os.path.join(download_dir, link.filename) - if not os.path.exists(already_downloaded): - already_downloaded = None - - if already_downloaded: - temp_location = already_downloaded - content_type = mimetypes.guess_type(already_downloaded)[0] - logger.notify('File was already downloaded %s' % already_downloaded) - if link.hash: - download_hash = _get_hash_from_file(temp_location, link) - try: - _check_hash(download_hash, link) - except HashMismatch: - logger.warn( - 'Previously-downloaded file %s has bad hash, ' - 're-downloading.' % temp_location - ) - temp_location = None - os.unlink(already_downloaded) - already_downloaded = None - - # We have a cached file, and we haven't already found a good downloaded copy - if already_cached and not temp_location: - with open(cache_content_type_file) as fp: - content_type = fp.read().strip() - temp_location = cache_file - logger.notify('Using download cache from %s' % cache_file) - if link.hash and link.hash_name: - download_hash = _get_hash_from_file(cache_file, link) - try: - _check_hash(download_hash, link) - except HashMismatch: - logger.warn( - 'Cached file %s has bad hash, ' - 're-downloading.' % temp_location - ) - temp_location = None - os.unlink(cache_file) - os.unlink(cache_content_type_file) - already_cached = False - - # We don't have either a cached or a downloaded copy - if not temp_location: - resp = _get_response_from_url(target_url, link) - content_type = resp.info().get('content-type', '') - filename = link.filename # fallback - # Have a look at the Content-Disposition header for a better guess - content_disposition = resp.info().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 != geturl(resp): - ext = os.path.splitext(geturl(resp))[1] - if ext: - filename += ext - temp_location = os.path.join(temp_dir, filename) - download_hash = _download_url(resp, link, temp_location) - if link.hash and link.hash_name: - _check_hash(download_hash, link) - - if download_dir and not already_downloaded: - _copy_file(temp_location, download_dir, content_type, link) - unpack_file(temp_location, location, content_type, link) - if cache_file and not already_cached: - cache_download(cache_file, temp_location, content_type) - if not (already_cached or already_downloaded): - os.unlink(temp_location) - os.rmdir(temp_dir) - - -def _get_response_from_url(target_url, link): - try: - resp = urlopen(target_url) - except urllib2.HTTPError: - e = sys.exc_info()[1] - logger.fatal("HTTP error %s while getting %s" % (e.code, link)) - raise - except IOError: - e = sys.exc_info()[1] - # Typically an FTP error - logger.fatal("Error %s while getting %s" % (e, link)) - raise - return resp - - -class Urllib2HeadRequest(urllib2.Request): - def get_method(self): - return "HEAD" diff --git a/PythonEnv/2.7/Lib/site-packages/pip/download.pyc b/PythonEnv/2.7/Lib/site-packages/pip/download.pyc deleted file mode 100644 index 878e2f57524df70cd5b56dc47e2f864c2839942a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23806 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 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/index.py b/PythonEnv/2.7/Lib/site-packages/pip/index.py deleted file mode 100644 index 98a6cac5b..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/index.py +++ /dev/null @@ -1,1041 +0,0 @@ -"""Routines related to PyPI, indexes""" - -import sys -import os -import re -import gzip -import mimetypes -import posixpath -import pkg_resources -import random -import socket -import ssl -import string -import zlib - -try: - import threading -except ImportError: - import dummy_threading as threading - -from pip.log import logger -from pip.util import Inf, normalize_name, splitext, is_prerelease -from pip.exceptions import DistributionNotFound, BestVersionAlreadyInstalled,\ - InstallationError -from pip.backwardcompat import (WindowsError, BytesIO, - Queue, urlparse, - URLError, HTTPError, u, - product, url2pathname, - Empty as QueueEmpty) -from pip.backwardcompat import CertificateError -from pip.download import urlopen, path_to_url2, url_to_path, geturl, Urllib2HeadRequest -from pip.wheel import Wheel, wheel_ext, wheel_setuptools_support, setuptools_requirement -from pip.pep425tags import supported_tags, supported_tags_noarch, get_platform -from pip.vendor import html5lib - -__all__ = ['PackageFinder'] - - -DEFAULT_MIRROR_HOSTNAME = "last.pypi.python.org" - - -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, index_urls, - use_mirrors=False, mirrors=None, main_mirror_url=None, - use_wheel=False, allow_external=[], allow_insecure=[], - allow_all_external=False, allow_all_insecure=False, - allow_all_prereleases=False): - self.find_links = find_links - self.index_urls = index_urls - self.dependency_links = [] - self.cache = PageCache() - # These are boring links that have already been logged somehow: - self.logged_links = set() - if use_mirrors: - self.mirror_urls = self._get_mirror_urls(mirrors, main_mirror_url) - logger.info('Using PyPI mirrors: %s' % ', '.join(self.mirror_urls)) - else: - self.mirror_urls = [] - self.use_wheel = use_wheel - - # Do we allow (safe and verifiable) externally hosted files? - self.allow_external = set(normalize_name(n) for n in allow_external) - - # Which names are allowed to install insecure and unverifiable files? - self.allow_insecure = set(normalize_name(n) for n in allow_insecure) - - # Do we allow all (safe and verifiable) externally hosted files? - self.allow_all_external = allow_all_external - - # Do we allow unsafe and unverifiable files? - self.allow_all_insecure = allow_all_insecure - - # Stores if we ignored any external links so that we can instruct - # end users how to install them if no distributions are available - self.need_warn_external = False - - # Stores if we ignored any unsafe links so that we can instruct - # end users how to install them if no distributions are available - self.need_warn_insecure = False - - # Do we want to allow _all_ pre-releases? - self.allow_all_prereleases = allow_all_prereleases - - @property - def use_wheel(self): - return self._use_wheel - - @use_wheel.setter - def use_wheel(self, value): - self._use_wheel = value - if self._use_wheel and not wheel_setuptools_support(): - raise InstallationError("pip's wheel support requires %s." % setuptools_requirement) - - def add_dependency_links(self, links): - ## FIXME: this shouldn't be global list this, it should only - ## apply to requirements of the package that specifies the - ## dependency_links value - ## FIXME: also, we should track comes_from (i.e., use Link) - self.dependency_links.extend(links) - - def _sort_locations(self, locations): - """ - 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_url2(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:') - is_find_link = url in self.find_links - - if is_local_path or is_file_url: - if is_local_path: - path = url - else: - path = url_to_path(url) - if is_find_link and os.path.isdir(path): - path = os.path.realpath(path) - for item in os.listdir(path): - sort_path(os.path.join(path, item)) - elif is_file_url and os.path.isdir(path): - urls.append(url) - elif os.path.isfile(path): - sort_path(path) - else: - urls.append(url) - - return files, urls - - def _link_sort_key(self, link_tuple): - """ - 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() - 3. source archives - 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 - """ - parsed_version, link, _ = link_tuple - if self.use_wheel: - support_num = len(supported_tags) - if link == InfLink: # existing install - pri = 1 - elif link.wheel: - # all wheel links are known to be supported at this stage - pri = -(link.wheel.support_index_min()) - else: # sdist - pri = -(support_num) - return (parsed_version, pri) - else: - return parsed_version - - def _sort_versions(self, applicable_versions): - """ - Bring the latest version (and wheels) to the front, but maintain the existing ordering as secondary. - See the docstring for `_link_sort_key` for details. - This function is isolated for easier unit testing. - """ - return sorted(applicable_versions, key=self._link_sort_key, reverse=True) - - def find_requirement(self, req, upgrade): - - def mkurl_pypi_url(url): - loc = posixpath.join(url, url_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 - - url_name = req.url_name - # Only check main index if index URL is given: - main_index_url = None - if self.index_urls: - # Check that we have the url_name correctly spelled: - main_index_url = Link(mkurl_pypi_url(self.index_urls[0]), trusted=True) - # This will also cache the page, so it's okay that we get it again later: - page = self._get_page(main_index_url, req) - if page is None: - url_name = self._find_url_name(Link(self.index_urls[0], trusted=True), url_name, req) or req.url_name - - # Combine index URLs with mirror URLs here to allow - # adding more index URLs from requirements files - all_index_urls = self.index_urls + self.mirror_urls - - if url_name is not None: - locations = [ - mkurl_pypi_url(url) - for url in all_index_urls] + self.find_links - else: - locations = list(self.find_links) - for version in req.absolute_versions: - if url_name is not None and main_index_url is not None: - locations = [ - posixpath.join(main_index_url.url, version)] + locations - - file_locations, url_locations = self._sort_locations(locations) - _flocations, _ulocations = self._sort_locations(self.dependency_links) - file_locations.extend(_flocations) - - # We trust every url that the user has given us whether it was given - # via --index-url, --user-mirrors/--mirror, or --find-links or a - # default option thereof - locations = [Link(url, trusted=True) for url in url_locations] - - # We explicitly do not trust links that came from dependency_links - locations.extend([Link(url) for url in _ulocations]) - - logger.debug('URLs to search for versions for %s:' % req) - for location in locations: - logger.debug('* %s' % location) - found_versions = [] - found_versions.extend( - self._package_versions( - # We trust every directly linked archive in find_links - [Link(url, '-f', trusted=True) for url in self.find_links], req.name.lower())) - page_versions = [] - for page in self._get_pages(locations, req): - logger.debug('Analyzing links from page %s' % page.url) - logger.indent += 2 - try: - page_versions.extend(self._package_versions(page.links, req.name.lower())) - finally: - logger.indent -= 2 - dependency_versions = list(self._package_versions( - [Link(url) for url in self.dependency_links], req.name.lower())) - if dependency_versions: - logger.info('dependency_links found: %s' % ', '.join([link.url for parsed, link, version in dependency_versions])) - file_versions = list(self._package_versions( - [Link(url) for url in file_locations], req.name.lower())) - if not found_versions and not page_versions and not dependency_versions and not file_versions: - logger.fatal('Could not find any downloads that satisfy the requirement %s' % req) - - if self.need_warn_external: - logger.warn("Some externally hosted files were ignored (use " - "--allow-external %s to allow)." % req.name) - - if self.need_warn_insecure: - logger.warn("Some insecure and unverifiable files were ignored" - " (use --allow-insecure %s to allow)." % req.name) - - raise DistributionNotFound('No distributions at all found for %s' % req) - installed_version = [] - if req.satisfied_by is not None: - installed_version = [(req.satisfied_by.parsed_version, InfLink, req.satisfied_by.version)] - if file_versions: - file_versions.sort(reverse=True) - logger.info('Local files found: %s' % ', '.join([url_to_path(link.url) for parsed, link, version in file_versions])) - #this is an intentional priority ordering - all_versions = installed_version + file_versions + found_versions + page_versions + dependency_versions - applicable_versions = [] - for (parsed_version, link, version) in all_versions: - if version not in req.req: - logger.info("Ignoring link %s, version %s doesn't match %s" - % (link, version, ','.join([''.join(s) for s in req.req.specs]))) - continue - elif is_prerelease(version) and not (self.allow_all_prereleases or req.prereleases): - # If this version isn't the already installed one, then - # ignore it if it's a pre-release. - if link is not InfLink: - logger.info("Ignoring link %s, version %s is a pre-release (use --pre to allow)." % (link, version)) - continue - applicable_versions.append((parsed_version, link, version)) - applicable_versions = self._sort_versions(applicable_versions) - existing_applicable = bool([link for parsed_version, link, version in applicable_versions if link is InfLink]) - if not upgrade and existing_applicable: - if applicable_versions[0][1] is InfLink: - logger.info('Existing installed version (%s) is most up-to-date and satisfies requirement' - % req.satisfied_by.version) - else: - logger.info('Existing installed version (%s) satisfies requirement (most up-to-date version is %s)' - % (req.satisfied_by.version, applicable_versions[0][2])) - return None - if not applicable_versions: - logger.fatal('Could not find a version that satisfies the requirement %s (from versions: %s)' - % (req, ', '.join([version for parsed_version, link, version in all_versions]))) - - if self.need_warn_external: - logger.warn("Some externally hosted files were ignored (use " - "--allow-external to allow).") - - if self.need_warn_insecure: - logger.warn("Some insecure and unverifiable files were ignored" - " (use --allow-insecure %s to allow)." % req.name) - - raise DistributionNotFound('No distributions matching the version for %s' % req) - if applicable_versions[0][1] is InfLink: - # We have an existing version, and its the best version - logger.info('Installed version (%s) is most up-to-date (past versions: %s)' - % (req.satisfied_by.version, ', '.join([version for parsed_version, link, version in applicable_versions[1:]]) or 'none')) - raise BestVersionAlreadyInstalled - if len(applicable_versions) > 1: - logger.info('Using version %s (newest of versions: %s)' % - (applicable_versions[0][2], ', '.join([version for parsed_version, link, version in applicable_versions]))) - - selected_version = applicable_versions[0][1] - - # TODO: Remove after 1.4 has been released - if (selected_version.internal is not None - and not selected_version.internal): - logger.warn("You are installing an externally hosted file. Future " - "versions of pip will default to disallowing " - "externally hosted files.") - - if (selected_version.verifiable is not None - and not selected_version.verifiable): - logger.warn("You are installing a potentially insecure and " - "unverifiable file. Future versions of pip will " - "default to disallowing insecure files.") - - return selected_version - - - def _find_url_name(self, index_url, url_name, req): - """Finds the true URL name of a package, when the given name isn't quite correct. - This is usually used to implement case-insensitivity.""" - if not index_url.url.endswith('/'): - # Vaguely part of the PyPI API... weird but true. - ## FIXME: bad to modify this? - index_url.url += '/' - page = self._get_page(index_url, req) - if page is None: - logger.fatal('Cannot fetch index base URL %s' % index_url) - return - norm_name = normalize_name(req.url_name) - for link in page.links: - base = posixpath.basename(link.path.rstrip('/')) - if norm_name == normalize_name(base): - logger.notify('Real name of requirement %s is %s' % (url_name, base)) - return base - return None - - def _get_pages(self, locations, req): - """Yields (page, page_url) from the given locations, skipping - locations that have errors, and adding download/homepage links""" - pending_queue = Queue() - for location in locations: - pending_queue.put(location) - done = [] - seen = set() - threads = [] - for i in range(min(10, len(locations))): - t = threading.Thread(target=self._get_queued_page, args=(req, pending_queue, done, seen)) - t.setDaemon(True) - threads.append(t) - t.start() - for t in threads: - t.join() - return done - - _log_lock = threading.Lock() - - def _get_queued_page(self, req, pending_queue, done, seen): - while 1: - try: - location = pending_queue.get(False) - except QueueEmpty: - return - if location in seen: - continue - seen.add(location) - page = self._get_page(location, req) - if page is None: - continue - done.append(page) - for link in page.rel_links(): - normalized = normalize_name(req.name).lower() - - if (not normalized in self.allow_external - and not self.allow_all_external): - self.need_warn_external = True - logger.debug("Not searching %s for files because external " - "urls are disallowed." % link) - continue - - if (link.trusted is not None - and not link.trusted - and not normalized in self.allow_insecure - and not self.allow_all_insecure): # TODO: Remove after release - logger.debug("Not searching %s for urls, it is an " - "untrusted link and cannot produce safe or " - "verifiable files." % link) - self.need_warn_insecure = True - continue - - pending_queue.put(link) - - _egg_fragment_re = re.compile(r'#egg=([^&]*)') - _egg_info_re = re.compile(r'([a-z0-9_.]+)-([a-z0-9_.-]+)', re.I) - _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') - - def _sort_links(self, links): - "Returns elements of links in order, non-egg links first, egg links second, while eliminating duplicates" - eggs, no_eggs = [], [] - seen = set() - 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, search_name): - for link in self._sort_links(links): - for v in self._link_package_versions(link, search_name): - yield v - - def _known_extensions(self): - extensions = ('.tar.gz', '.tar.bz2', '.tar', '.tgz', '.zip') - if self.use_wheel: - return extensions + (wheel_ext,) - return extensions - - def _link_package_versions(self, link, search_name): - """ - Return an iterable of triples (pkg_resources_version_key, - link, python_version) that can be extracted from the given - link. - - Meant to be overridden by subclasses, not called by clients. - """ - platform = get_platform() - - version = None - if link.egg_fragment: - egg_info = link.egg_fragment - else: - egg_info, ext = link.splitext() - if not ext: - if link not in self.logged_links: - logger.debug('Skipping link %s; not a file' % link) - self.logged_links.add(link) - return [] - if egg_info.endswith('.tar'): - # Special double-extension case: - egg_info = egg_info[:-4] - ext = '.tar' + ext - if ext not in self._known_extensions(): - if link not in self.logged_links: - logger.debug('Skipping link %s; unknown archive format: %s' % (link, ext)) - self.logged_links.add(link) - return [] - if "macosx10" in link.path and ext == '.zip': - if link not in self.logged_links: - logger.debug('Skipping link %s; macosx10 one' % (link)) - self.logged_links.add(link) - return [] - if link.wheel and link.wheel.name.lower() == search_name.lower(): - version = link.wheel.version - if not link.wheel.supported(): - logger.debug('Skipping %s because it is not compatible with this Python' % link) - return [] - - # This is a dirty hack to prevent installing Binary Wheels from - # PyPI or one of its mirrors unless it is a Windows Binary - # Wheel. This is paired with a change to PyPI disabling - # uploads for the same. Once we have a mechanism for enabling - # support for binary wheels on linux that deals with the - # inherent problems of binary distribution this can be - # removed. - comes_from = getattr(link, "comes_from", None) - if (not platform.startswith('win') - and comes_from is not None - and urlparse.urlparse(comes_from.url).netloc.endswith( - "pypi.python.org")): - if not link.wheel.supported(tags=supported_tags_noarch): - logger.debug( - "Skipping %s because it is a pypi-hosted binary " - "Wheel on an unsupported platform" % link - ) - return [] - - if not version: - version = self._egg_info_matches(egg_info, search_name, link) - if version is None: - logger.debug('Skipping link %s; wrong project name (not %s)' % (link, search_name)) - return [] - - if (link.internal is not None - and not link.internal - and not normalize_name(search_name).lower() in self.allow_external - and not self.allow_all_external): - # We have a link that we are sure is external, so we should skip - # it unless we are allowing externals - logger.debug("Skipping %s because it is externally hosted." % link) - self.need_warn_external = True - return [] - - if (link.verifiable is not None - and not link.verifiable - and not normalize_name(search_name).lower() in self.allow_insecure - and not self.allow_all_insecure): # TODO: Remove after release - # We have a link that we are sure we cannot verify it's integrity, - # so we should skip it unless we are allowing unsafe installs - # for this requirement. - logger.debug("Skipping %s because it is an insecure and " - "unverifiable file." % link) - self.need_warn_insecure = True - return [] - - match = self._py_version_re.search(version) - if match: - version = version[:match.start()] - py_version = match.group(1) - if py_version != sys.version[:3]: - logger.debug('Skipping %s because Python version is incorrect' % link) - return [] - logger.debug('Found link %s, version: %s' % (link, version)) - return [(pkg_resources.parse_version(version), - link, - version)] - - def _egg_info_matches(self, egg_info, search_name, link): - match = self._egg_info_re.search(egg_info) - if not match: - logger.debug('Could not parse version from link: %s' % link) - return None - name = match.group(0).lower() - # To match the "safe" name that pkg_resources creates: - name = name.replace('_', '-') - # project name and version must be separated by a dash - look_for = search_name.lower() + "-" - if name.startswith(look_for): - return match.group(0)[len(look_for):] - else: - return None - - def _get_page(self, link, req): - return HTMLPage.get_page(link, req, cache=self.cache) - - def _get_mirror_urls(self, mirrors=None, main_mirror_url=None): - """Retrieves a list of URLs from the main mirror DNS entry - unless a list of mirror URLs are passed. - """ - if not mirrors: - mirrors = get_mirrors(main_mirror_url) - # Should this be made "less random"? E.g. netselect like? - random.shuffle(mirrors) - - mirror_urls = set() - for mirror_url in mirrors: - mirror_url = mirror_url.rstrip('/') - # Make sure we have a valid URL - if not any([mirror_url.startswith(scheme) for scheme in ["http://", "https://", "file://"]]): - mirror_url = "http://%s" % mirror_url - if not mirror_url.endswith("/simple"): - mirror_url = "%s/simple" % mirror_url - mirror_urls.add(mirror_url + '/') - - return list(mirror_urls) - - -class PageCache(object): - """Cache of HTML pages""" - - failure_limit = 3 - - def __init__(self): - self._failures = {} - self._pages = {} - self._archives = {} - - def too_many_failures(self, url): - return self._failures.get(url, 0) >= self.failure_limit - - def get_page(self, url): - return self._pages.get(url) - - def is_archive(self, url): - return self._archives.get(url, False) - - def set_is_archive(self, url, value=True): - self._archives[url] = value - - def add_page_failure(self, url, level): - self._failures[url] = self._failures.get(url, 0)+level - - def add_page(self, urls, page): - for url in urls: - self._pages[url] = page - - -class HTMLPage(object): - """Represents one page, along with its URL""" - - ## FIXME: these regexes are horrible hacks: - _homepage_re = re.compile(r'\s*home\s*page', re.I) - _download_re = re.compile(r'\s*download\s+url', re.I) - _href_re = re.compile('href=(?:"([^"]*)"|\'([^\']*)\'|([^>\\s\\n]*))', re.I|re.S) - - def __init__(self, content, url, headers=None, trusted=None): - self.content = content - self.parsed = html5lib.parse(self.content, namespaceHTMLElements=False) - self.url = url - self.headers = headers - self.trusted = trusted - - def __str__(self): - return self.url - - @classmethod - def get_page(cls, link, req, cache=None, skip_archives=True): - url = link.url - url = url.split('#', 1)[0] - if cache.too_many_failures(url): - return None - - # Check for VCS schemes that do not support lookup as web pages. - from pip.vcs import VcsSupport - for scheme in VcsSupport.schemes: - if url.lower().startswith(scheme) and url[len(scheme)] in '+:': - logger.debug('Cannot look at %(scheme)s URL %(link)s' % locals()) - return None - - if cache is not None: - inst = cache.get_page(url) - if inst is not None: - return inst - try: - if skip_archives: - if cache is not None: - if cache.is_archive(url): - return None - filename = link.filename - for bad_ext in ['.tar', '.tar.gz', '.tar.bz2', '.tgz', '.zip']: - if filename.endswith(bad_ext): - content_type = cls._get_content_type(url) - if content_type.lower().startswith('text/html'): - break - else: - logger.debug('Skipping page %s because of Content-Type: %s' % (link, content_type)) - if cache is not None: - cache.set_is_archive(url) - return None - logger.debug('Getting page %s' % url) - - # Tack index.html onto file:// URLs that point to directories - (scheme, netloc, path, params, query, fragment) = urlparse.urlparse(url) - if scheme == 'file' and os.path.isdir(url2pathname(path)): - # add trailing slash if not present so urljoin doesn't trim final segment - if not url.endswith('/'): - url += '/' - url = urlparse.urljoin(url, 'index.html') - logger.debug(' file: URL is directory, getting %s' % url) - - resp = urlopen(url) - - real_url = geturl(resp) - headers = resp.info() - contents = resp.read() - encoding = headers.get('Content-Encoding', None) - #XXX need to handle exceptions and add testing for this - if encoding is not None: - if encoding == 'gzip': - contents = gzip.GzipFile(fileobj=BytesIO(contents)).read() - if encoding == 'deflate': - contents = zlib.decompress(contents) - - # The check for archives above only works if the url ends with - # something that looks like an archive. However that is not a - # requirement. For instance http://sourceforge.net/projects/docutils/files/docutils/0.8.1/docutils-0.8.1.tar.gz/download - # redirects to http://superb-dca3.dl.sourceforge.net/project/docutils/docutils/0.8.1/docutils-0.8.1.tar.gz - # 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. - content_type = headers.get('Content-Type', 'unknown') - if not content_type.lower().startswith("text/html"): - logger.debug('Skipping page %s because of Content-Type: %s' % - (link, content_type)) - if cache is not None: - cache.set_is_archive(url) - return None - - inst = cls(u(contents), real_url, headers, trusted=link.trusted) - except (HTTPError, URLError, socket.timeout, socket.error, OSError, WindowsError): - e = sys.exc_info()[1] - desc = str(e) - if isinstance(e, socket.timeout): - log_meth = logger.info - level =1 - desc = 'timed out' - elif isinstance(e, URLError): - #ssl/certificate error - if hasattr(e, 'reason') and (isinstance(e.reason, ssl.SSLError) or isinstance(e.reason, CertificateError)): - desc = 'There was a problem confirming the ssl certificate: %s' % e - log_meth = logger.notify - else: - log_meth = logger.info - if hasattr(e, 'reason') and isinstance(e.reason, socket.timeout): - desc = 'timed out' - level = 1 - else: - level = 2 - elif isinstance(e, HTTPError) and e.code == 404: - ## FIXME: notify? - log_meth = logger.info - level = 2 - else: - log_meth = logger.info - level = 1 - log_meth('Could not fetch URL %s: %s' % (link, desc)) - log_meth('Will skip URL %s when looking for download links for %s' % (link.url, req)) - if cache is not None: - cache.add_page_failure(url, level) - return None - if cache is not None: - cache.add_page([url, real_url], inst) - return inst - - @staticmethod - def _get_content_type(url): - """Get the Content-Type of the given url, using a HEAD request""" - scheme, netloc, path, query, fragment = urlparse.urlsplit(url) - if not scheme in ('http', 'https', 'ftp', 'ftps'): - ## FIXME: some warning or something? - ## assertion error? - return '' - req = Urllib2HeadRequest(url, headers={'Host': netloc}) - resp = urlopen(req) - try: - if hasattr(resp, 'code') and resp.code != 200 and scheme not in ('ftp', 'ftps'): - ## FIXME: doesn't handle redirects - return '' - return resp.info().get('content-type', '') - finally: - resp.close() - - @property - def api_version(self): - if not hasattr(self, "_api_version"): - _api_version = None - - metas = [x for x in self.parsed.findall(".//meta") - if x.get("name", "").lower() == "api-version"] - if metas: - try: - _api_version = int(metas[0].get("value", None)) - except (TypeError, ValueError): - _api_version = None - self._api_version = _api_version - return self._api_version - - @property - def base_url(self): - if not hasattr(self, "_base_url"): - base = self.parsed.find(".//base") - if base is not None and base.get("href"): - self._base_url = base.get("href") - else: - self._base_url = self.url - return self._base_url - - @property - def links(self): - """Yields all links in the page""" - for anchor in self.parsed.findall(".//a"): - if anchor.get("href"): - href = anchor.get("href") - url = self.clean_link(urlparse.urljoin(self.base_url, href)) - - # Determine if this link is internal. If that distinction - # doesn't make sense in this context, then we don't make - # any distinction. - internal = None - if self.api_version and self.api_version >= 2: - # Only api_versions >= 2 have a distinction between - # external and internal links - internal = bool(anchor.get("rel") - and "internal" in anchor.get("rel").split()) - - yield Link(url, self, internal=internal) - - def rel_links(self): - for url in self.explicit_rel_links(): - yield url - for url in self.scraped_rel_links(): - yield url - - def explicit_rel_links(self, rels=('homepage', 'download')): - """Yields all links with the given relations""" - rels = set(rels) - - for anchor in self.parsed.findall(".//a"): - if anchor.get("rel") and anchor.get("href"): - found_rels = set(anchor.get("rel").split()) - # Determine the intersection between what rels were found and - # what rels were being looked for - if found_rels & rels: - href = anchor.get("href") - url = self.clean_link(urlparse.urljoin(self.base_url, href)) - yield Link(url, self, trusted=False) - - def scraped_rel_links(self): - # Can we get rid of this horrible horrible method? - for regex in (self._homepage_re, self._download_re): - match = regex.search(self.content) - if not match: - continue - href_match = self._href_re.search(self.content, pos=match.end()) - if not href_match: - continue - url = href_match.group(1) or href_match.group(2) or href_match.group(3) - if not url: - continue - url = self.clean_link(urlparse.urljoin(self.base_url, url)) - yield Link(url, self, trusted=False) - - _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) - - def clean_link(self, url): - """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).""" - return self._clean_re.sub( - lambda match: '%%%2x' % ord(match.group(0)), url) - - -class Link(object): - - def __init__(self, url, comes_from=None, internal=None, trusted=None): - self.url = url - self.comes_from = comes_from - self.internal = internal - self.trusted = trusted - - # Set whether it's a wheel - self.wheel = None - if url != Inf and self.splitext()[1] == wheel_ext: - self.wheel = Wheel(self.filename) - - def __str__(self): - if self.comes_from: - return '%s (from %s)' % (self.url, self.comes_from) - else: - return str(self.url) - - def __repr__(self): - return '' % self - - def __eq__(self, other): - return self.url == other.url - - def __ne__(self, other): - return self.url != other.url - - def __lt__(self, other): - return self.url < other.url - - def __le__(self, other): - return self.url <= other.url - - def __gt__(self, other): - return self.url > other.url - - def __ge__(self, other): - return self.url >= other.url - - def __hash__(self): - return hash(self.url) - - @property - def filename(self): - _, netloc, path, _, _ = urlparse.urlsplit(self.url) - name = posixpath.basename(path.rstrip('/')) or netloc - assert name, ('URL %r produced no filename' % self.url) - return name - - @property - def scheme(self): - return urlparse.urlsplit(self.url)[0] - - @property - def path(self): - return urlparse.urlsplit(self.url)[2] - - def splitext(self): - return splitext(posixpath.basename(self.path.rstrip('/'))) - - @property - def url_without_fragment(self): - scheme, netloc, path, query, fragment = urlparse.urlsplit(self.url) - return urlparse.urlunsplit((scheme, netloc, path, query, None)) - - _egg_fragment_re = re.compile(r'#egg=([^&]*)') - - @property - def egg_fragment(self): - match = self._egg_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): - match = self._hash_re.search(self.url) - if match: - return match.group(2) - return None - - @property - def hash_name(self): - match = self._hash_re.search(self.url) - if match: - return match.group(1) - return None - - @property - def show_url(self): - return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0]) - - @property - def verifiable(self): - """ - Returns True if this link can be verified after download, False if it - cannot, and None if we cannot determine. - """ - trusted = self.trusted or getattr(self.comes_from, "trusted", None) - if trusted is not None and trusted: - # This link came from a trusted source. It *may* be verifiable but - # first we need to see if this page is operating under the new - # API version. - try: - api_version = getattr(self.comes_from, "api_version", None) - api_version = int(api_version) - except (ValueError, TypeError): - api_version = None - - if api_version is None or api_version <= 1: - # This link is either trusted, or it came from a trusted, - # however it is not operating under the API version 2 so - # we can't make any claims about if it's safe or not - return - - if self.hash: - # This link came from a trusted source and it has a hash, so we - # can consider it safe. - return True - else: - # This link came from a trusted source, using the new API - # version, and it does not have a hash. It is NOT verifiable - return False - elif trusted is not None: - # This link came from an untrusted source and we cannot trust it - return False - -#An "Infinite Link" that compares greater than other links -InfLink = Link(Inf) #this object is not currently used as a sortable - - -def get_requirement_from_url(url): - """Get a requirement from the URL, if possible. This looks for #egg - in the URL""" - link = Link(url) - egg_info = link.egg_fragment - if not egg_info: - egg_info = splitext(link.filename)[0] - return package_to_requirement(egg_info) - - -def package_to_requirement(package_name): - """Translate a name like Foo-1.2 to Foo==1.3""" - match = re.search(r'^(.*?)-(dev|\d.*)', package_name) - if match: - name = match.group(1) - version = match.group(2) - else: - name = package_name - version = '' - if version: - return '%s==%s' % (name, version) - else: - return name - - -def get_mirrors(hostname=None): - """Return the list of mirrors from the last record found on the DNS - entry:: - - >>> from pip.index import get_mirrors - >>> get_mirrors() - ['a.pypi.python.org', 'b.pypi.python.org', 'c.pypi.python.org', - 'd.pypi.python.org'] - - Originally written for the distutils2 project by Alexis Metaireau. - """ - if hostname is None: - hostname = DEFAULT_MIRROR_HOSTNAME - - # return the last mirror registered on PyPI. - last_mirror_hostname = None - try: - last_mirror_hostname = socket.gethostbyname_ex(hostname)[0] - except socket.gaierror: - return [] - if not last_mirror_hostname or last_mirror_hostname == DEFAULT_MIRROR_HOSTNAME: - last_mirror_hostname = "z.pypi.python.org" - end_letter = last_mirror_hostname.split(".", 1) - - # determine the list from the last one. - return ["%s.%s" % (s, end_letter[1]) for s in string_range(end_letter[0])] - - -def string_range(last): - """Compute the range of string between "a" and last. - - This works for simple "a to z" lists, but also for "a to zz" lists. - """ - for k in range(len(last)): - for x in product(string.ascii_lowercase, repeat=k+1): - result = ''.join(x) - yield result - if result == last: - return - diff --git a/PythonEnv/2.7/Lib/site-packages/pip/index.pyc b/PythonEnv/2.7/Lib/site-packages/pip/index.pyc deleted file mode 100644 index 626530cdbee34f3a831950f63818d855d8b4a627..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37796 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 N{4SO6pfatN{s#hQ5e)zU diff --git a/PythonEnv/2.7/Lib/site-packages/pip/log.py b/PythonEnv/2.7/Lib/site-packages/pip/log.py deleted file mode 100644 index 9eb02b90d..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/log.py +++ /dev/null @@ -1,187 +0,0 @@ -"""Logging -""" - -import sys -import logging - -from pip import backwardcompat - - -class Logger(object): - """ - Logging object for use in command-line script. Allows ranges of - levels, to avoid some redundancy of displayed information. - """ - VERBOSE_DEBUG = logging.DEBUG - 1 - DEBUG = logging.DEBUG - INFO = logging.INFO - NOTIFY = (logging.INFO + logging.WARN) / 2 - WARN = WARNING = logging.WARN - ERROR = logging.ERROR - FATAL = logging.FATAL - - LEVELS = [VERBOSE_DEBUG, DEBUG, INFO, NOTIFY, WARN, ERROR, FATAL] - - def __init__(self): - self.consumers = [] - self.indent = 0 - self.explicit_levels = False - self.in_progress = None - self.in_progress_hanging = False - - def debug(self, msg, *args, **kw): - self.log(self.DEBUG, msg, *args, **kw) - - def info(self, msg, *args, **kw): - self.log(self.INFO, msg, *args, **kw) - - def notify(self, msg, *args, **kw): - self.log(self.NOTIFY, msg, *args, **kw) - - def warn(self, msg, *args, **kw): - self.log(self.WARN, msg, *args, **kw) - - def error(self, msg, *args, **kw): - self.log(self.WARN, msg, *args, **kw) - - def fatal(self, msg, *args, **kw): - self.log(self.FATAL, msg, *args, **kw) - - def log(self, level, msg, *args, **kw): - if args: - if kw: - raise TypeError( - "You may give positional or keyword arguments, not both") - args = args or kw - rendered = None - for consumer_level, consumer in self.consumers: - if self.level_matches(level, consumer_level): - if (self.in_progress_hanging - and consumer in (sys.stdout, sys.stderr)): - self.in_progress_hanging = False - sys.stdout.write('\n') - sys.stdout.flush() - if rendered is None: - if args: - rendered = msg % args - else: - rendered = msg - rendered = ' ' * self.indent + rendered - if self.explicit_levels: - ## FIXME: should this be a name, not a level number? - rendered = '%02i %s' % (level, rendered) - if hasattr(consumer, 'write'): - rendered += '\n' - backwardcompat.fwrite(consumer, rendered) - else: - consumer(rendered) - - def _show_progress(self): - """Should we display download progress?""" - return (self.stdout_level_matches(self.NOTIFY) and sys.stdout.isatty()) - - def start_progress(self, msg): - assert not self.in_progress, ( - "Tried to start_progress(%r) while in_progress %r" - % (msg, self.in_progress)) - if self._show_progress(): - sys.stdout.write(' ' * self.indent + msg) - sys.stdout.flush() - self.in_progress_hanging = True - else: - self.in_progress_hanging = False - self.in_progress = msg - self.last_message = None - - def end_progress(self, msg='done.'): - assert self.in_progress, ( - "Tried to end_progress without start_progress") - if self._show_progress(): - if not self.in_progress_hanging: - # Some message has been printed out since start_progress - sys.stdout.write('...' + self.in_progress + msg + '\n') - sys.stdout.flush() - else: - # These erase any messages shown with show_progress (besides .'s) - logger.show_progress('') - logger.show_progress('') - sys.stdout.write(msg + '\n') - sys.stdout.flush() - self.in_progress = None - self.in_progress_hanging = False - - def show_progress(self, message=None): - """If we are in a progress scope, and no log messages have been - shown, write out another '.'""" - if self.in_progress_hanging: - if message is None: - sys.stdout.write('.') - sys.stdout.flush() - else: - if self.last_message: - padding = ' ' * max(0, len(self.last_message) - len(message)) - else: - padding = '' - sys.stdout.write('\r%s%s%s%s' % - (' ' * self.indent, self.in_progress, message, padding)) - sys.stdout.flush() - self.last_message = message - - def stdout_level_matches(self, level): - """Returns true if a message at this level will go to stdout""" - return self.level_matches(level, self._stdout_level()) - - def _stdout_level(self): - """Returns the level that stdout runs at""" - for level, consumer in self.consumers: - if consumer is sys.stdout: - return level - return self.FATAL - - def level_matches(self, level, consumer_level): - """ - >>> l = Logger() - >>> l.level_matches(3, 4) - False - >>> l.level_matches(3, 2) - True - >>> l.level_matches(slice(None, 3), 3) - False - >>> l.level_matches(slice(None, 3), 2) - True - >>> l.level_matches(slice(1, 3), 1) - True - >>> l.level_matches(slice(2, 3), 1) - False - """ - if isinstance(level, slice): - start, stop = level.start, level.stop - if start is not None and start > consumer_level: - return False - if stop is not None or stop <= consumer_level: - return False - return True - else: - return level >= consumer_level - - @classmethod - def level_for_integer(cls, level): - levels = cls.LEVELS - if level < 0: - return levels[0] - if level >= len(levels): - return levels[-1] - return levels[level] - - def move_stdout_to_stderr(self): - to_remove = [] - to_add = [] - for consumer_level, consumer in self.consumers: - if consumer == sys.stdout: - to_remove.append((consumer_level, consumer)) - to_add.append((consumer_level, sys.stderr)) - for item in to_remove: - self.consumers.remove(item) - self.consumers.extend(to_add) - -logger = Logger() diff --git a/PythonEnv/2.7/Lib/site-packages/pip/log.pyc b/PythonEnv/2.7/Lib/site-packages/pip/log.pyc deleted file mode 100644 index 45548ace758e3c52b912840b505a00a88e220905..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7579 zcmc&(TW=f36`oyElu1dEe3NgrJw@V}P94>8k~&QjC%(vrTZ3*#ZVVGj*%fz5uC&~x zc9xa|ST9LXpbza^llQ*#sXz+!5A@&ky+HHWe%~32lANGvQ7aa;!!x&?nRETlu=J0a z+8_Szo3LYGuhQvI@OmX#NlRWzYG7%`zf zQ|eQt9ycp0s*q|<@*PX{3SWH)#r>??jni%|{ulllbq`I&ODI-?_S!~}hwZFC2#SK^ zIW)@0JDfz*O*~d(QiNAyL6p9VN@}&tU7c)Bj4Id`TPuni5rXBUI)Tj`Zyu7iNma(~ znpLUPRI?_;lxj}#I1%1}xfnXBB6LluE(TAlu*5SqXB19N;-%54o3kpcNXwiGCxtky z!b3tFQDIexqbjTkaZH6%LL67&v=H+u#5-S7pMl*cREYLjp--uBP6nJ-;b9@psPKpo z-&4_96&@x1DQ2Bh;W24Hugp??o}BtEikimXi0e9AS&iC-?qsuyPBJeFH^Tsi#V{MDIv=s_>ScZxE&WQcc7w-wnmml z#T1A*Z4L6Qn@83bNB7rTJ+K41>y(zWY?O5B_*PO_11fxXxf>U~;mY!(IK7c{z@9zS zN}Mj=j#h@<<)3dAy)0c!pDbTpxVC&hURkzr5xqWu83f?@@*o~8Cs}u4uvO4(TCF(6 zj$5Zd+ZqbxRY#vT*}&cKln?OOvnar?RabiIDgMFAlKQ<5YbEE%{D$zaD1pR6!lT=Z zH-CAz&UYE|Qu_L~D;x^)u7yC9TH84IBl9RB`J_QuuByEM@0^Chm4n=C+=Z}4<6pT^Y{gxjhjfbBJOOx`g~7Eraii08ZYo{+yVkr zdg-~I%pAw-Uf`){Xi=VL`Q_(&Ea!1=JiKxL1)r@G6hZRCJ!hl4qeG>tinDwNz7Vc4 zKc}9SSr!t25Kuqy)cQGbtRN>=nN15vGDsV!spg)3KMeZh+UY~+ZD^*OXkWPi9dh!&}; zhO#pZ3OE3Q7hy>YNTc10tf6crZrLpd0c;UwLkB29Le~u~*_`1xYJVpg+Mc0W7*-4J zq8C_T(46sH36AKvz3}BOGIFRa{7n3iV4X*R9SHmaYOLmSe+({$j$MuOf|Y}H;t zp}Yz{C2!W7#`nB;1OVbBo;iHjGUHdg!(P>&$B3GD)c-n6JCB!8r(Ee#Q!`kMuT}+u zLsuQNu&-d?QZE}Oq27pgK%ow^jWo%EQ12kD59-45V;JqkRn>^=Uk zQMV^iD5yY{kAL2qE6qR|j=?=vUG_m{@Iayhe+A)$nSV(uMEcM8{PwOtgyoA3JO7AK zinp(0teAM-r8XekK#tC^p&uAdTIQWZ_P8XuvJJ5NdmVb`AeW1PVChPY%j*p%-iN}a=@8j7!TVVTv@UL}wZf-q#pj^+c+(G4#!*6~>0yQmU12w@d& z zh~9{kM0Ydi=ZScnN%1N`46n5}!0s`(S1{n<*~1kW7+u2akVOe~KDXHZ7K+W+M%=jl z@p(bj9+hfxtP3Z%yTB81;4I?qkU98zY zbZ~6t*RNmKiGE)$5~I9+X@AGUJ`7%e^Rj+xcZ6KLecSk}yW{ifr0Z#BhSJ zY>^Fi1E^tOml*E=l_>G6Xfr=y@g95e9IQIi+58TVWzMGNW`UP!Pu^dBXk0j~4GQ znYXcq*tUd?c4Ec6WrXOgJ#elRhp`1`AGi?5HEt0B4E+g>mLNnSMofE$kc`3d>Gc@| z$Cm#&DqW?vJt=*)X~r({uDD2N`M5uDE)u?Be&iMC0?N$y2|>UwI0`gz+_-gpUg7`I zCayj_TxHDj4#5coXqBlyv;Cg)wSrlkDE3|`5eK zv{|4_ei3p(n|PqeT6>0|hQMt^f9Z)u;c*$zKX_^JK8{=6iI>=lyEga|9rg$cmqs&5 zKI)wneAuXKGy}Nto<0rwQLBaYjFo;C4ii?%r&cS>+9R5f7{J6(1tdOyv}kTVSXyk! z6}+L&$km`>3M{jE{duo(SG>TYF%OJk+%oU8;9`bGXShMbgvJnDm=i4cn}OT}IH dG=4Xy6Fqs)X~uOz5&1o*;!h*(oGZ=$<=;6yR!IN= diff --git a/PythonEnv/2.7/Lib/site-packages/pip/pep425tags.py b/PythonEnv/2.7/Lib/site-packages/pip/pep425tags.py deleted file mode 100644 index 95d375395..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/pep425tags.py +++ /dev/null @@ -1,102 +0,0 @@ -"""Generate and work with PEP 425 Compatibility Tags.""" - -import sys -import warnings - -try: - import sysconfig -except ImportError: # pragma nocover - # Python < 2.7 - import distutils.sysconfig as sysconfig -import distutils.util - - -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.""" - return ''.join(map(str, sys.version_info[:2])) - - -def get_platform(): - """Return our platform name 'win32', 'linux_x86_64'""" - # XXX remove distutils dependency - return distutils.util.get_platform().replace('.', '_').replace('-', '_') - - -def get_supported(versions=None, noarch=False): - """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 = [] - major = sys.version_info[0] - # Support all previous minor Python versions. - for minor in range(sys.version_info[1], -1, -1): - versions.append(''.join(map(str, (major, minor)))) - - impl = get_abbr_impl() - - abis = [] - - try: - soabi = sysconfig.get_config_var('SOABI') - except IOError as e: # Issue #1074 - warnings.warn("{0}".format(e), RuntimeWarning) - soabi = None - - if soabi and soabi.startswith('cpython-'): - abis[0:0] = ['cp' + soabi.split('-', 1)[-1]] - - 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 = get_platform() - - # Current version, current API (built specifically for our Python): - for abi in abis: - supported.append(('%s%s' % (impl, versions[0]), 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')) - - # 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 - -supported_tags = get_supported() -supported_tags_noarch = get_supported(noarch=True) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/pep425tags.pyc b/PythonEnv/2.7/Lib/site-packages/pip/pep425tags.pyc deleted file mode 100644 index 6d11ce1728dc44222d27ca39d6ec4ebec206f555..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3346 zcmcguU2+@85$;)lAOQiSBwDg)mt9jzQG_E3wn_g*Wm|SkIi+$+RxPD4p}~R|*a5g8 zu)EwDkU#}^l8=!$A0dbE1#$sb_}d@RghYpE6@?xR6dgjyWseR$np|CU3v^hZgIH716zQZw*%MMq&2^Wk zFY~dYKhK9sbhu1mfquaLD-;$*C{ws3LWRwlDupHb0fuU1YV;hMt1N`eWY*AChp_I^ zetm_V-9hsQ6Pqk>Mh9`I&y(y#pGWRkKY92>f3WkR{wf)!fs5MFAaWD^H0aqz^dI~l z%h44!DB%AU@AeFh!z0Ii?ooD&P0fhn-|=AI;}gOC=ZdmjcAux-o=@QrCs^_gyU*h# zb{WEy7S3*Ad*8TG7VDth&dgZ^uR|RT(}5Y9*ul#r)^RX24R;N?=_H-B&P--8+=}9E z;yfNrT@kN-a280vKXH734vxpuQ7W%aT4yb{jOIA7fpeLt*@<cX2KVwb`&@FOncO8KAE`VBz_p5 zHFp{xH~$#5n>KRhUK(^xf}XL>G)kMPNf92$@kl4GhTVI{wHTNdTVBP0y^4msHC0yE z@yFXMDG3{obH+;8-hzMx>r3QtdK|Q02l6?_4a6P*GKzKH zJjXeSVnJ>gq&b2v^BF-`Me|~GF0pzQfU$K3jE}-e@+SJ0T_^7XAwISsvq`zl zhk!Je3k`tslm=Rm_a$lUdr+Svm5egI$Q4OVy>%YNyE|LkdTS8Hqj78e$w#e^KG?$j zAZke4lJ;JnfMpDak#!>%4Xhx_l7PqVFZPy1%?!F7^GbpAZ^1#0e-2)u!x(bj@y!wN z{*I9z(ahtk99HOLg|br_k%R*)0LzV8fyR$G^>U&Bo*Q5aCW`{?9o?l_k(YB`7OB6) zcMM0K7HC?eu3(Qu#iLFifKajV3b>ADOJb))lXY@s>VqMdSZlTnr5!4|E5f=zk(#ZL z0;qiuWr_N$G{t&F4vguMg40;RJUm^dtfMtzDVl=B zgbeSpOV`CE=-^xx8m!Z-LgQ~}TA}`HJhgZ98O^TH^ojt&7OseeJ8BBwZ(K~k5J(=} z4&(rnocfMBy`v6buYZ%=>*Q_`)?g-o6i)!URqm^)BKr^JHpHDOjXz{R_l|x`vl>m2 z&`?~X>5_yCkpa9nrh8i(g5EQePY z>!;`_A^V@zOS(cs8=MWlSabTb!gDYVU$ptBU)a1xQy5hL*Wfd6Zcr52(#x)$KJ)M# zKxw~zos;^XXcjd`4{#54($#j9rb))Nhv`?N4rmi}j`f_)v`tMX>PB3f;)=%a`}vIh zzEP2Z`)QB`!^Hx7Uk8_)yDW-(7gO78&>b7LGSuJQ-rc>ut#9w{+&Vh)nx?sGkHOyc|BLdO;$ z{q?<>W#aCj+@Lz$^SR9VH_$w`Tq_$vJMz~dNCgn8is6;aZQ4yM>>tDv8AvCaw$7X@ zdhERv1)uA-*v*0%{Kh7NG&OPPb3yahxM6njnZI$R5u%ChByl(DIo4oK%)6~K6lEr% zN8dioGK7nLKM%4P=;lPq9kIaBqQZ-XQS73jImq>VuI}QFP4Rt@*DsU5Q8+GG*p9m0 zXl&+33`5z~j2-+I(Mq<+Q8|Z%GsSrmBP#syRp&#Ai;Gl|g>e#Oo#XtRi=-2OhCv^D za)5?W42c84rA!0_!scEl5T%+J>7%!6{dd?DBb&ROFJUtr<;8+Xu$wz`Sy5imXUxS7 zyTfjNjfR#>g{ms4ny1yahYuOApw{t8v!N>94YlQ!RTcepRrfZ$8a{K%g_^os*ic$k z3-99n7UnlS|9$LKmn7rVXtlzm(`x0Z_ZtlO8V#xfvS!FvJkK0X>WdoOcsb!N$GI;1 zH=!!I=`(#upnd+n68OIk2G;lwxXZbAamW_ah=k#3HZqQ{)XQ_NJP$6zAkwcK3%)O( k4wG;+FrPCq*f-FWysD}K`l|@UI-o7r%1h=0.7, it won't contain an importable - # setuptools, and having an egg-info dir blocks the ability of - # setup.py to find setuptools plugins, so delete the egg-info dir if - # no setuptools. it will get recreated by the run of egg_info - # NOTE: this self.name check only works when installing from a specifier - # (not archive path/urls) - # TODO: take this out later - if self.name == 'distribute' and not os.path.isdir(os.path.join(self.source_dir, 'setuptools')): - rmtree(os.path.join(self.source_dir, 'distribute.egg-info')) - - script = self._run_setup_py - script = script.replace('__SETUP_PY__', repr(self.setup_py)) - script = script.replace('__PKG_NAME__', repr(self.name)) - egg_info_cmd = [sys.executable, '-c', script, '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 or force_root_egg_info: - egg_base_option = [] - else: - egg_info_dir = os.path.join(self.source_dir, 'pip-egg-info') - if not os.path.exists(egg_info_dir): - os.makedirs(egg_info_dir) - egg_base_option = ['--egg-base', 'pip-egg-info'] - call_subprocess( - egg_info_cmd + egg_base_option, - cwd=self.source_dir, filter_stdout=self._filter_install, show_stdout=False, - command_level=logger.VERBOSE_DEBUG, - command_desc='python setup.py egg_info') - finally: - logger.indent -= 2 - if not self.req: - self.req = pkg_resources.Requirement.parse( - "%(Name)s==%(Version)s" % self.pkg_info()) - self.correct_build_location() - - ## FIXME: This is a lame hack, entirely for PasteScript which has - ## a self-provided entry point that causes this awkwardness - _run_setup_py = """ -__file__ = __SETUP_PY__ -from setuptools.command import egg_info -import pkg_resources -import os -def replacement_run(self): - self.mkpath(self.egg_info) - installer = self.distribution.fetch_build_egg - for ep in pkg_resources.iter_entry_points('egg_info.writers'): - # require=False is the change we're making: - writer = ep.load(require=False) - if writer: - writer(self, ep.name, os.path.join(self.egg_info,ep.name)) - self.find_sources() -egg_info.egg_info.run = replacement_run -exec(compile(open(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec')) -""" - - def egg_info_data(self, filename): - if self.satisfied_by is not None: - if not self.satisfied_by.has_metadata(filename): - return None - return self.satisfied_by.get_metadata(filename) - assert self.source_dir - filename = self.egg_info_path(filename) - if not os.path.exists(filename): - return None - fp = open(filename, 'r') - data = fp.read() - fp.close() - return data - - def egg_info_path(self, filename): - if self._egg_info_path is None: - if self.editable: - base = self.source_dir - else: - base = os.path.join(self.source_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.exists(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 - if 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('No files/directories in %s (from %s)' % (base, filename)) - assert filenames, "No files/directories in %s (from %s)" % (base, filename) - - # 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 os.path.join(self._egg_info_path, filename) - - def egg_info_lines(self, filename): - data = self.egg_info_data(filename) - if not data: - return [] - result = [] - for line in data.splitlines(): - line = line.strip() - if not line or line.startswith('#'): - continue - result.append(line) - return result - - def pkg_info(self): - p = FeedParser() - data = self.egg_info_data('PKG-INFO') - if not data: - logger.warn('No PKG-INFO file found in %s' % display_path(self.egg_info_path('PKG-INFO'))) - p.feed(data or '') - return p.close() - - @property - def dependency_links(self): - return self.egg_info_lines('dependency_links.txt') - - _requirements_section_re = re.compile(r'\[(.*?)\]') - - def requirements(self, extras=()): - in_extra = None - for line in self.egg_info_lines('requires.txt'): - match = self._requirements_section_re.match(line.lower()) - if match: - in_extra = match.group(1) - continue - if in_extra and in_extra not in extras: - logger.debug('skipping extra %s' % in_extra) - # Skip requirement for an extra we aren't requiring - continue - yield line - - @property - def absolute_versions(self): - for qualifier, version in self.req.specs: - if qualifier == '==': - yield version - - @property - def installed_version(self): - return self.pkg_info()['version'] - - def assert_source_matches_version(self): - assert self.source_dir - version = self.installed_version - if version not in self.req: - logger.warn('Requested %s, but installing version %s' % (self, self.installed_version)) - else: - logger.debug('Source in %s has version %s, which satisfies requirement %s' - % (display_path(self.source_dir), version, self)) - - def update_editable(self, obtain=True): - if not self.url: - logger.info("Cannot update repository at %s; repository location is unknown" % self.source_dir) - return - assert self.editable - assert self.source_dir - if self.url.startswith('file:'): - # Static paths don't get updated - return - assert '+' in self.url, "bad url: %r" % self.url - if not self.update: - return - vc_type, url = self.url.split('+', 1) - backend = vcs.get_backend(vc_type) - if backend: - vcs_backend = backend(self.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.url, vc_type)) - - def uninstall(self, auto_confirm=False): - """ - 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(): - raise UninstallationError("Cannot uninstall requirement %s, not installed" % (self.name,)) - dist = self.satisfied_by or self.conflicts_with - - paths_to_remove = UninstallPathSet(dist) - - pip_egg_info_path = os.path.join(dist.location, - dist.egg_name()) + '.egg-info' - dist_info_path = os.path.join(dist.location, - '-'.join(dist.egg_name().split('-')[:2]) - ) + '.dist-info' - # workaround for http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=618367 - debian_egg_info_path = pip_egg_info_path.replace( - '-py%s' % pkg_resources.PY_MAJOR, '') - easy_install_egg = dist.egg_name() + '.egg' - develop_egg_link = egg_link_path(dist) - - pip_egg_info_exists = os.path.exists(pip_egg_info_path) - debian_egg_info_exists = os.path.exists(debian_egg_info_path) - dist_info_exists = os.path.exists(dist_info_path) - if pip_egg_info_exists or debian_egg_info_exists: - # package installed by pip - if pip_egg_info_exists: - egg_info_path = pip_egg_info_path - else: - egg_info_path = debian_egg_info_path - paths_to_remove.add(egg_info_path) - 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(egg_info_path, 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') - - elif dist.location.endswith(easy_install_egg): - # package installed by easy_install - paths_to_remove.add(dist.location) - 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 develop_egg_link: - # develop egg - fh = open(develop_egg_link, 'r') - link_pointer = os.path.normcase(fh.readline().strip()) - fh.close() - assert (link_pointer == dist.location), 'Egg-link %s does not match installed location of %s (at %s)' % (link_pointer, self.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) - elif dist_info_exists: - for path in pip.wheel.uninstallation_paths(dist): - paths_to_remove.add(path) - - # find distutils scripts= scripts - if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'): - for script in dist.metadata_listdir('scripts'): - paths_to_remove.add(os.path.join(bin_py, script)) - if sys.platform == 'win32': - paths_to_remove.add(os.path.join(bin_py, script) + '.bat') - - # find console_scripts - if dist.has_metadata('entry_points.txt'): - config = ConfigParser.SafeConfigParser() - config.readfp(FakeFile(dist.get_metadata_lines('entry_points.txt'))) - if config.has_section('console_scripts'): - for name, value in config.items('console_scripts'): - paths_to_remove.add(os.path.join(bin_py, name)) - if sys.platform == 'win32': - paths_to_remove.add(os.path.join(bin_py, name) + '.exe') - paths_to_remove.add(os.path.join(bin_py, name) + '.exe.manifest') - paths_to_remove.add(os.path.join(bin_py, name) + '-script.py') - - paths_to_remove.remove(auto_confirm) - self.uninstalled = paths_to_remove - - def rollback_uninstall(self): - if self.uninstalled: - self.uninstalled.rollback() - else: - logger.error("Can't rollback %s, nothing uninstalled." - % (self.project_name,)) - - def commit_uninstall(self): - if self.uninstalled: - self.uninstalled.commit() - else: - logger.error("Can't commit %s, nothing uninstalled." - % (self.project_name,)) - - def archive(self, build_dir): - assert self.source_dir - create_archive = True - archive_name = '%s-%s.zip' % (self.name, self.installed_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 ' % - display_path(archive_path), ('i', 'w', 'b')) - if response == 'i': - create_archive = False - elif response == 'w': - logger.warn('Deleting %s' % display_path(archive_path)) - os.remove(archive_path) - elif response == 'b': - dest_file = backup_dir(archive_path) - logger.warn('Backing up %s to %s' - % (display_path(archive_path), display_path(dest_file))) - shutil.move(archive_path, dest_file) - if create_archive: - zip = zipfile.ZipFile(archive_path, 'w', zipfile.ZIP_DEFLATED) - dir = os.path.normcase(os.path.abspath(self.source_dir)) - for dirpath, dirnames, filenames in os.walk(dir): - if 'pip-egg-info' in dirnames: - dirnames.remove('pip-egg-info') - for dirname in dirnames: - dirname = os.path.join(dirpath, dirname) - name = self._clean_zip_name(dirname, dir) - zipdir = zipfile.ZipInfo(self.name + '/' + name + '/') - zipdir.external_attr = 0x1ED << 16 # 0o755 - zip.writestr(zipdir, '') - for filename in filenames: - if filename == PIP_DELETE_MARKER_FILENAME: - continue - filename = os.path.join(dirpath, filename) - name = self._clean_zip_name(filename, dir) - zip.write(filename, self.name + '/' + name) - zip.close() - logger.indent -= 2 - logger.notify('Saved %s' % display_path(archive_path)) - - def _clean_zip_name(self, name, prefix): - 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 install(self, install_options, global_options=(), root=None): - if self.editable: - self.install_editable(install_options, global_options) - return - if self.is_wheel: - self.move_wheel_files(self.source_dir) - self.install_succeeded = True - return - - temp_location = tempfile.mkdtemp('-record', 'pip-') - record_filename = os.path.join(temp_location, 'install-record.txt') - try: - install_args = [sys.executable] - install_args.append('-c') - install_args.append( - "import setuptools;__file__=%r;"\ - "exec(compile(open(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec'))" % self.setup_py) - install_args += list(global_options) + ['install','--record', record_filename] - - if not self.as_egg: - install_args += ['--single-version-externally-managed'] - - if root is not None: - install_args += ['--root', root] - - if running_under_virtualenv(): - ## FIXME: I'm not sure if this is a reasonable location; probably not - ## but we can't put it in the default location, as that is a virtualenv symlink that isn't writable - install_args += ['--install-headers', - os.path.join(sys.prefix, 'include', 'site', - 'python' + get_python_version())] - logger.notify('Running setup.py install for %s' % self.name) - logger.indent += 2 - try: - call_subprocess(install_args + install_options, - cwd=self.source_dir, filter_stdout=self._filter_install, show_stdout=False) - finally: - logger.indent -= 2 - if not os.path.exists(record_filename): - logger.notify('Record file %s not found' % record_filename) - return - self.install_succeeded = True - if self.as_egg: - # there's no --always-unzip option we can pass to install command - # so we unable to save the installed-files.txt - return - - def prepend_root(path): - if root is None or not os.path.isabs(path): - return path - else: - return change_root(root, path) - - f = open(record_filename) - for line in f: - line = line.strip() - if line.endswith('.egg-info'): - egg_info_dir = prepend_root(line) - break - else: - logger.warn('Could not find .egg-info directory in install record for %s' % self) - ## FIXME: put the record somewhere - ## FIXME: should this be an error? - return - f.close() - new_lines = [] - f = open(record_filename) - for line in f: - filename = line.strip() - if os.path.isdir(filename): - filename += os.path.sep - new_lines.append(make_path_relative(prepend_root(filename), egg_info_dir)) - f.close() - f = open(os.path.join(egg_info_dir, 'installed-files.txt'), 'w') - f.write('\n'.join(new_lines)+'\n') - f.close() - finally: - if os.path.exists(record_filename): - os.remove(record_filename) - os.rmdir(temp_location) - - def remove_temporary_source(self): - """Remove the source files from this requirement, if they are marked - for deletion""" - if self.is_bundle or os.path.exists(self.delete_marker_filename): - logger.info('Removing source in %s' % self.source_dir) - if self.source_dir: - rmtree(self.source_dir) - self.source_dir = None - if self._temp_build_dir and os.path.exists(self._temp_build_dir): - rmtree(self._temp_build_dir) - self._temp_build_dir = None - - def install_editable(self, install_options, global_options=()): - logger.notify('Running setup.py develop for %s' % self.name) - logger.indent += 2 - try: - ## FIXME: should we do --install-headers here too? - call_subprocess( - [sys.executable, '-c', - "import setuptools; __file__=%r; exec(compile(open(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec'))" % self.setup_py] - + list(global_options) + ['develop', '--no-deps'] + list(install_options), - - cwd=self.source_dir, filter_stdout=self._filter_install, - show_stdout=False) - finally: - logger.indent -= 2 - self.install_succeeded = True - - def _filter_install(self, line): - level = logger.NOTIFY - for regex in [r'^running .*', r'^writing .*', '^creating .*', '^[Cc]opying .*', - r'^reading .*', r"^removing .*\.egg-info' \(and everything under it\)$", - r'^byte-compiling ', - # Not sure what this warning is, but it seems harmless: - r"^warning: manifest_maker: standard file '-c' not found$"]: - if re.search(regex, line.strip()): - level = logger.INFO - break - return (level, line) - - def check_if_exists(self): - """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: - # DISTRIBUTE TO SETUPTOOLS UPGRADE HACK (1 of 3 parts) - # if we've already set distribute as a conflict to setuptools - # then this check has already run before. we don't want it to - # run again, and return False, since it would block the uninstall - # TODO: remove this later - if (self.req.project_name == 'setuptools' - and self.conflicts_with - and self.conflicts_with.project_name == 'distribute'): - return True - else: - self.satisfied_by = pkg_resources.get_distribution(self.req) - except pkg_resources.DistributionNotFound: - return False - except pkg_resources.VersionConflict: - existing_dist = pkg_resources.get_distribution(self.req.project_name) - if self.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 - - @property - def is_wheel(self): - return self.url and '.whl' in self.url - - @property - def is_bundle(self): - if self._is_bundle is not None: - return self._is_bundle - base = self._temp_build_dir - if not base: - ## FIXME: this doesn't seem right: - return False - self._is_bundle = (os.path.exists(os.path.join(base, 'pip-manifest.txt')) - or os.path.exists(os.path.join(base, 'pyinstall-manifest.txt'))) - return self._is_bundle - - def bundle_requirements(self): - for dest_dir in self._bundle_editable_dirs: - package = os.path.basename(dest_dir) - ## FIXME: svnism: - for vcs_backend in vcs.backends: - url = rev = None - vcs_bundle_file = os.path.join( - dest_dir, vcs_backend.bundle_file) - if os.path.exists(vcs_bundle_file): - vc_type = vcs_backend.name - fp = open(vcs_bundle_file) - content = fp.read() - fp.close() - url, rev = vcs_backend().parse_vcs_bundle_file(content) - break - if url: - url = '%s+%s@%s' % (vc_type, url, rev) - else: - url = None - yield InstallRequirement( - package, self, editable=True, url=url, - update=False, source_dir=dest_dir, from_bundle=True) - for dest_dir in self._bundle_build_dirs: - package = os.path.basename(dest_dir) - yield InstallRequirement(package, self,source_dir=dest_dir, from_bundle=True) - - def move_bundle_files(self, dest_build_dir, dest_src_dir): - base = self._temp_build_dir - assert base - src_dir = os.path.join(base, 'src') - build_dir = os.path.join(base, 'build') - bundle_build_dirs = [] - bundle_editable_dirs = [] - for source_dir, dest_dir, dir_collection in [ - (src_dir, dest_src_dir, bundle_editable_dirs), - (build_dir, dest_build_dir, bundle_build_dirs)]: - if os.path.exists(source_dir): - for dirname in os.listdir(source_dir): - dest = os.path.join(dest_dir, dirname) - dir_collection.append(dest) - if os.path.exists(dest): - logger.warn('The directory %s (containing package %s) already exists; cannot move source from bundle %s' - % (dest, dirname, self)) - continue - if not os.path.exists(dest_dir): - logger.info('Creating directory %s' % dest_dir) - os.makedirs(dest_dir) - shutil.move(os.path.join(source_dir, dirname), dest) - if not os.listdir(source_dir): - os.rmdir(source_dir) - self._temp_build_dir = None - self._bundle_build_dirs = bundle_build_dirs - self._bundle_editable_dirs = bundle_editable_dirs - - def move_wheel_files(self, wheeldir): - move_wheel_files(self.name, self.req, wheeldir, user=self.use_user_site, home=self.target_dir) - - @property - def delete_marker_filename(self): - assert self.source_dir - return os.path.join(self.source_dir, PIP_DELETE_MARKER_FILENAME) - - -class Requirements(object): - - def __init__(self): - self._keys = [] - self._dict = {} - - def keys(self): - return self._keys - - def values(self): - return [self._dict[key] for key in self._keys] - - def __contains__(self, item): - return item in self._keys - - def __setitem__(self, key, value): - if key not in self._keys: - self._keys.append(key) - self._dict[key] = value - - def __getitem__(self, key): - return self._dict[key] - - def __repr__(self): - values = ['%s: %s' % (repr(k), repr(self[k])) for k in self.keys()] - return 'Requirements({%s})' % ', '.join(values) - - -class RequirementSet(object): - - def __init__(self, build_dir, src_dir, download_dir, download_cache=None, - upgrade=False, ignore_installed=False, as_egg=False, target_dir=None, - ignore_dependencies=False, force_reinstall=False, use_user_site=False): - self.build_dir = build_dir - self.src_dir = src_dir - self.download_dir = download_dir - self.download_cache = download_cache - self.upgrade = upgrade - self.ignore_installed = ignore_installed - self.force_reinstall = force_reinstall - self.requirements = Requirements() - # Mapping of alias: real_name - self.requirement_aliases = {} - self.unnamed_requirements = [] - self.ignore_dependencies = ignore_dependencies - self.successfully_downloaded = [] - self.successfully_installed = [] - self.reqs_to_cleanup = [] - self.as_egg = as_egg - self.use_user_site = use_user_site - self.target_dir = target_dir #set from --target option - - def __str__(self): - 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 add_requirement(self, install_req): - name = install_req.name - install_req.as_egg = self.as_egg - install_req.use_user_site = self.use_user_site - install_req.target_dir = self.target_dir - if not name: - #url or path requirement w/o an egg fragment - self.unnamed_requirements.append(install_req) - else: - if self.has_requirement(name): - raise InstallationError( - 'Double requirement given: %s (already in %s, name=%r)' - % (install_req, self.get_requirement(name), name)) - self.requirements[name] = install_req - ## FIXME: what about other normalizations? E.g., _ vs. -? - if name.lower() != name: - self.requirement_aliases[name.lower()] = name - - def has_requirement(self, project_name): - for name in project_name, project_name.lower(): - if name in self.requirements or name in self.requirement_aliases: - return True - return False - - @property - def has_requirements(self): - return list(self.requirements.values()) or self.unnamed_requirements - - @property - def has_editables(self): - if any(req.editable for req in self.requirements.values()): - return True - if any(req.editable for req in self.unnamed_requirements): - return True - return False - - @property - def is_download(self): - if self.download_dir: - self.download_dir = os.path.expanduser(self.download_dir) - if os.path.exists(self.download_dir): - return True - else: - logger.fatal('Could not find download directory') - raise InstallationError( - "Could not find or access download directory '%s'" - % display_path(self.download_dir)) - return False - - def get_requirement(self, project_name): - 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 uninstall(self, auto_confirm=False): - for req in self.requirements.values(): - req.uninstall(auto_confirm=auto_confirm) - req.commit_uninstall() - - def locate_files(self): - ## FIXME: duplicates code from prepare_files; relevant code should - ## probably be factored out into a separate method - unnamed = list(self.unnamed_requirements) - reqs = list(self.requirements.values()) - while reqs or unnamed: - if unnamed: - req_to_install = unnamed.pop(0) - else: - req_to_install = reqs.pop(0) - install_needed = True - if not self.ignore_installed and not req_to_install.editable: - req_to_install.check_if_exists() - if req_to_install.satisfied_by: - if self.upgrade: - #don't uninstall conflict if user install and and conflict is not user install - if not (self.use_user_site and not dist_in_usersite(req_to_install.satisfied_by)): - req_to_install.conflicts_with = req_to_install.satisfied_by - req_to_install.satisfied_by = None - else: - install_needed = False - if req_to_install.satisfied_by: - logger.notify('Requirement already satisfied ' - '(use --upgrade to upgrade): %s' - % req_to_install) - - if req_to_install.editable: - if req_to_install.source_dir is None: - req_to_install.source_dir = req_to_install.build_location(self.src_dir) - elif install_needed: - req_to_install.source_dir = req_to_install.build_location(self.build_dir, not self.is_download) - - if req_to_install.source_dir is not None and not os.path.isdir(req_to_install.source_dir): - raise InstallationError('Could not install requirement %s ' - 'because source folder %s does not exist ' - '(perhaps --no-download was used without first running ' - 'an equivalent install with --no-install?)' - % (req_to_install, req_to_install.source_dir)) - - def prepare_files(self, finder, force_root_egg_info=False, bundle=False): - """Prepare process. Create temp directories, download and/or unpack files.""" - unnamed = list(self.unnamed_requirements) - reqs = list(self.requirements.values()) - while reqs or unnamed: - if unnamed: - req_to_install = unnamed.pop(0) - else: - req_to_install = reqs.pop(0) - install = True - best_installed = False - not_found = None - if not self.ignore_installed and not req_to_install.editable: - req_to_install.check_if_exists() - if req_to_install.satisfied_by: - if self.upgrade: - if not self.force_reinstall and not req_to_install.url: - try: - url = finder.find_requirement( - req_to_install, self.upgrade) - except BestVersionAlreadyInstalled: - best_installed = True - install = False - except DistributionNotFound: - not_found = sys.exc_info()[1] - else: - # Avoid the need to call find_requirement again - req_to_install.url = url.url - - if not best_installed: - #don't uninstall conflict if user install and conflict is not user install - if not (self.use_user_site and not dist_in_usersite(req_to_install.satisfied_by)): - req_to_install.conflicts_with = req_to_install.satisfied_by - req_to_install.satisfied_by = None - else: - install = False - if req_to_install.satisfied_by: - if best_installed: - logger.notify('Requirement already up-to-date: %s' - % req_to_install) - else: - logger.notify('Requirement already satisfied ' - '(use --upgrade to upgrade): %s' - % req_to_install) - if req_to_install.editable: - logger.notify('Obtaining %s' % req_to_install) - elif install: - if req_to_install.url and req_to_install.url.lower().startswith('file:'): - logger.notify('Unpacking %s' % display_path(url_to_path(req_to_install.url))) - else: - logger.notify('Downloading/unpacking %s' % req_to_install) - logger.indent += 2 - try: - is_bundle = False - is_wheel = False - if req_to_install.editable: - if req_to_install.source_dir is None: - location = req_to_install.build_location(self.src_dir) - req_to_install.source_dir = location - else: - location = req_to_install.source_dir - if not os.path.exists(self.build_dir): - _make_build_dir(self.build_dir) - req_to_install.update_editable(not self.is_download) - if self.is_download: - req_to_install.run_egg_info() - req_to_install.archive(self.download_dir) - else: - req_to_install.run_egg_info() - elif install: - ##@@ if filesystem packages are not marked - ##editable in a req, a non deterministic error - ##occurs when the script attempts to unpack the - ##build directory - - # NB: This call can result in the creation of a temporary build directory - location = req_to_install.build_location(self.build_dir, not self.is_download) - unpack = True - url = None - - # In the case where the req comes from a bundle, we should - # assume a build dir exists and move on - if req_to_install.from_bundle: - pass - # If a checkout exists, it's unwise to keep going. version - # inconsistencies are logged later, but do not fail the - # installation. - elif os.path.exists(os.path.join(location, 'setup.py')): - msg = textwrap.dedent(""" - pip can't proceed with requirement '%s' due to a pre-existing build directory. - location: %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_to_install, location)) - e = PreviousBuildDirError(msg) - logger.fatal(msg) - raise e - else: - ## FIXME: this won't upgrade when there's an existing package unpacked in `location` - if req_to_install.url is None: - if not_found: - raise not_found - url = finder.find_requirement(req_to_install, upgrade=self.upgrade) - else: - ## FIXME: should req_to_install.url already be a link? - url = Link(req_to_install.url) - assert url - if url: - try: - self.unpack_url(url, location, self.is_download) - except HTTPError: - e = sys.exc_info()[1] - logger.fatal('Could not install requirement %s because of error %s' - % (req_to_install, e)) - raise InstallationError( - 'Could not install requirement %s because of HTTP error %s for URL %s' - % (req_to_install, e, url)) - else: - unpack = False - if unpack: - is_bundle = req_to_install.is_bundle - is_wheel = url and url.filename.endswith('.whl') - if is_bundle: - req_to_install.move_bundle_files(self.build_dir, self.src_dir) - for subreq in req_to_install.bundle_requirements(): - reqs.append(subreq) - self.add_requirement(subreq) - elif self.is_download: - req_to_install.source_dir = location - if not is_wheel: - # FIXME: see https://github.com/pypa/pip/issues/1112 - req_to_install.run_egg_info() - if url and url.scheme in vcs.all_schemes: - req_to_install.archive(self.download_dir) - elif is_wheel: - req_to_install.source_dir = location - req_to_install.url = url.url - dist = list(pkg_resources.find_distributions(location))[0] - if not req_to_install.req: - req_to_install.req = dist.as_requirement() - self.add_requirement(req_to_install) - if not self.ignore_dependencies: - for subreq in dist.requires(req_to_install.extras): - if self.has_requirement(subreq.project_name): - continue - subreq = InstallRequirement(str(subreq), - req_to_install) - reqs.append(subreq) - self.add_requirement(subreq) - else: - req_to_install.source_dir = location - req_to_install.run_egg_info() - if force_root_egg_info: - # We need to run this to make sure that the .egg-info/ - # directory is created for packing in the bundle - req_to_install.run_egg_info(force_root_egg_info=True) - req_to_install.assert_source_matches_version() - #@@ sketchy way of identifying packages not grabbed from an index - if bundle and req_to_install.url: - self.copy_to_build_dir(req_to_install) - install = False - # req_to_install.req is only avail after unpack for URL pkgs - # repeat check_if_exists to uninstall-on-upgrade (#14) - req_to_install.check_if_exists() - if req_to_install.satisfied_by: - if self.upgrade or self.ignore_installed: - #don't uninstall conflict if user install and and conflict is not user install - if not (self.use_user_site and not dist_in_usersite(req_to_install.satisfied_by)): - req_to_install.conflicts_with = req_to_install.satisfied_by - req_to_install.satisfied_by = None - else: - install = False - if not (is_bundle or is_wheel): - ## FIXME: shouldn't be globally added: - finder.add_dependency_links(req_to_install.dependency_links) - if (req_to_install.extras): - logger.notify("Installing extra requirements: %r" % ','.join(req_to_install.extras)) - if not self.ignore_dependencies: - for req in req_to_install.requirements(req_to_install.extras): - try: - name = pkg_resources.Requirement.parse(req).project_name - except ValueError: - e = sys.exc_info()[1] - ## FIXME: proper warning - logger.error('Invalid requirement: %r (%s) in requirement %s' % (req, e, req_to_install)) - continue - if self.has_requirement(name): - ## FIXME: check for conflict - continue - subreq = InstallRequirement(req, req_to_install) - reqs.append(subreq) - self.add_requirement(subreq) - if not self.has_requirement(req_to_install.name): - #'unnamed' requirements will get added here - self.add_requirement(req_to_install) - if self.is_download or req_to_install._temp_build_dir is not None: - self.reqs_to_cleanup.append(req_to_install) - else: - self.reqs_to_cleanup.append(req_to_install) - - if install: - self.successfully_downloaded.append(req_to_install) - if bundle and (req_to_install.url and req_to_install.url.startswith('file:///')): - self.copy_to_build_dir(req_to_install) - finally: - logger.indent -= 2 - - def cleanup_files(self, bundle=False): - """Clean up files, remove builds.""" - logger.notify('Cleaning up...') - logger.indent += 2 - for req in self.reqs_to_cleanup: - req.remove_temporary_source() - - remove_dir = [] - if self._pip_has_created_build_dir(): - remove_dir.append(self.build_dir) - - # The source dir of a bundle can always be removed. - # FIXME: not if it pre-existed the bundle! - if bundle: - remove_dir.append(self.src_dir) - - for dir in remove_dir: - if os.path.exists(dir): - logger.info('Removing temporary dir %s...' % dir) - rmtree(dir) - - logger.indent -= 2 - - def _pip_has_created_build_dir(self): - return (self.build_dir == build_prefix and - os.path.exists(os.path.join(self.build_dir, PIP_DELETE_MARKER_FILENAME))) - - def copy_to_build_dir(self, req_to_install): - target_dir = req_to_install.editable and self.src_dir or self.build_dir - logger.info("Copying %s to %s" % (req_to_install.name, target_dir)) - dest = os.path.join(target_dir, req_to_install.name) - shutil.copytree(req_to_install.source_dir, dest) - call_subprocess(["python", "%s/setup.py" % dest, "clean"], cwd=dest, - command_desc='python setup.py clean') - - def unpack_url(self, link, location, only_download=False): - if only_download: - loc = self.download_dir - else: - loc = location - if is_vcs_url(link): - return unpack_vcs_link(link, loc, only_download) - # a local file:// index could have links with hashes - elif not link.hash and is_file_url(link): - return unpack_file_url(link, loc) - else: - if self.download_cache: - self.download_cache = os.path.expanduser(self.download_cache) - retval = unpack_http_url(link, location, self.download_cache, self.download_dir) - if only_download: - write_delete_marker_file(location) - return retval - - def install(self, install_options, global_options=(), *args, **kwargs): - """Install everything in this set (after having downloaded and unpacked the packages)""" - to_install = [r for r in self.requirements.values() - if not r.satisfied_by] - - # DISTRIBUTE TO SETUPTOOLS UPGRADE HACK (1 of 3 parts) - # move the distribute-0.7.X wrapper to the end because it does not - # install a setuptools package. by moving it to the end, we ensure it's - # setuptools dependency is handled first, which will provide the - # setuptools package - # TODO: take this out later - distribute_req = pkg_resources.Requirement.parse("distribute>=0.7") - for req in to_install: - if req.name == 'distribute' and req.installed_version in distribute_req: - to_install.remove(req) - to_install.append(req) - - if to_install: - logger.notify('Installing collected packages: %s' % ', '.join([req.name for req in to_install])) - logger.indent += 2 - try: - for requirement in to_install: - - # DISTRIBUTE TO SETUPTOOLS UPGRADE HACK (1 of 3 parts) - # when upgrading from distribute-0.6.X to the new merged - # setuptools in py2, we need to force setuptools to uninstall - # distribute. In py3, which is always using distribute, this - # conversion is already happening in distribute's pkg_resources. - # It's ok *not* to check if setuptools>=0.7 because if someone - # were actually trying to ugrade from distribute to setuptools - # 0.6.X, then all this could do is actually help, although that - # upgade path was certainly never "supported" - # TODO: remove this later - if requirement.name == 'setuptools': - try: - # only uninstall distribute<0.7. For >=0.7, setuptools - # will also be present, and that's what we need to - # uninstall - distribute_requirement = pkg_resources.Requirement.parse("distribute<0.7") - existing_distribute = pkg_resources.get_distribution("distribute") - if existing_distribute in distribute_requirement: - requirement.conflicts_with = existing_distribute - except pkg_resources.DistributionNotFound: - # distribute wasn't installed, so nothing to do - pass - - if requirement.conflicts_with: - logger.notify('Found existing installation: %s' - % requirement.conflicts_with) - logger.indent += 2 - try: - requirement.uninstall(auto_confirm=True) - finally: - logger.indent -= 2 - try: - requirement.install(install_options, global_options, *args, **kwargs) - except: - # if install did not succeed, rollback previous uninstall - if requirement.conflicts_with and not requirement.install_succeeded: - requirement.rollback_uninstall() - raise - else: - if requirement.conflicts_with and requirement.install_succeeded: - requirement.commit_uninstall() - requirement.remove_temporary_source() - finally: - logger.indent -= 2 - self.successfully_installed = to_install - - def create_bundle(self, bundle_filename): - ## FIXME: can't decide which is better; zip is easier to read - ## random files from, but tar.bz2 is smaller and not as lame a - ## format. - - ## FIXME: this file should really include a manifest of the - ## packages, maybe some other metadata files. It would make - ## it easier to detect as well. - zip = zipfile.ZipFile(bundle_filename, 'w', zipfile.ZIP_DEFLATED) - vcs_dirs = [] - for dir, basename in (self.build_dir, 'build'), (self.src_dir, 'src'): - dir = os.path.normcase(os.path.abspath(dir)) - for dirpath, dirnames, filenames in os.walk(dir): - for backend in vcs.backends: - vcs_backend = backend() - vcs_url = vcs_rev = None - if vcs_backend.dirname in dirnames: - for vcs_dir in vcs_dirs: - if dirpath.startswith(vcs_dir): - # vcs bundle file already in parent directory - break - else: - vcs_url, vcs_rev = vcs_backend.get_info( - os.path.join(dir, dirpath)) - vcs_dirs.append(dirpath) - vcs_bundle_file = vcs_backend.bundle_file - vcs_guide = vcs_backend.guide % {'url': vcs_url, - 'rev': vcs_rev} - dirnames.remove(vcs_backend.dirname) - break - if 'pip-egg-info' in dirnames: - dirnames.remove('pip-egg-info') - for dirname in dirnames: - dirname = os.path.join(dirpath, dirname) - name = self._clean_zip_name(dirname, dir) - zip.writestr(basename + '/' + name + '/', '') - for filename in filenames: - if filename == PIP_DELETE_MARKER_FILENAME: - continue - filename = os.path.join(dirpath, filename) - name = self._clean_zip_name(filename, dir) - zip.write(filename, basename + '/' + name) - if vcs_url: - name = os.path.join(dirpath, vcs_bundle_file) - name = self._clean_zip_name(name, dir) - zip.writestr(basename + '/' + name, vcs_guide) - - zip.writestr('pip-manifest.txt', self.bundle_requirements()) - zip.close() - - BUNDLE_HEADER = '''\ -# This is a pip bundle file, that contains many source packages -# that can be installed as a group. You can install this like: -# pip this_file.zip -# The rest of the file contains a list of all the packages included: -''' - - def bundle_requirements(self): - parts = [self.BUNDLE_HEADER] - for req in [req for req in self.requirements.values() - if not req.comes_from]: - parts.append('%s==%s\n' % (req.name, req.installed_version)) - parts.append('# These packages were installed to satisfy the above requirements:\n') - for req in [req for req in self.requirements.values() - if req.comes_from]: - parts.append('%s==%s\n' % (req.name, req.installed_version)) - ## FIXME: should we do something with self.unnamed_requirements? - return ''.join(parts) - - def _clean_zip_name(self, name, prefix): - 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 _make_build_dir(build_dir): - os.makedirs(build_dir) - write_delete_marker_file(build_dir) - - -_scheme_re = re.compile(r'^(http|https|file):', re.I) - - -def parse_requirements(filename, finder=None, comes_from=None, options=None): - skip_match = None - skip_regex = options.skip_requirements_regex if options else None - if skip_regex: - skip_match = re.compile(skip_regex) - reqs_file_dir = os.path.dirname(os.path.abspath(filename)) - filename, content = get_file_content(filename, comes_from=comes_from) - for line_number, line in enumerate(content.splitlines()): - line_number += 1 - line = line.strip() - if not line or line.startswith('#'): - continue - if skip_match and skip_match.search(line): - continue - if line.startswith('-r') or line.startswith('--requirement'): - if line.startswith('-r'): - req_url = line[2:].strip() - else: - req_url = line[len('--requirement'):].strip().strip('=') - if _scheme_re.search(filename): - # Relative to a URL - req_url = urlparse.urljoin(filename, req_url) - elif not _scheme_re.search(req_url): - req_url = os.path.join(os.path.dirname(filename), req_url) - for item in parse_requirements(req_url, finder, comes_from=filename, options=options): - yield item - elif line.startswith('-Z') or line.startswith('--always-unzip'): - # No longer used, but previously these were used in - # requirement files, so we'll ignore. - pass - elif line.startswith('-f') or line.startswith('--find-links'): - if line.startswith('-f'): - line = line[2:].strip() - else: - line = line[len('--find-links'):].strip().lstrip('=') - ## 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 - relative_to_reqs_file = os.path.join(reqs_file_dir, line) - if os.path.exists(relative_to_reqs_file): - line = relative_to_reqs_file - if finder: - finder.find_links.append(line) - elif line.startswith('-i') or line.startswith('--index-url'): - if line.startswith('-i'): - line = line[2:].strip() - else: - line = line[len('--index-url'):].strip().lstrip('=') - if finder: - finder.index_urls = [line] - elif line.startswith('--extra-index-url'): - line = line[len('--extra-index-url'):].strip().lstrip('=') - if finder: - finder.index_urls.append(line) - elif line.startswith('--use-wheel'): - finder.use_wheel = True - elif line.startswith('--no-index'): - finder.index_urls = [] - elif line.startswith("--allow-external"): - line = line[len("--allow-external"):].strip().lstrip("=") - finder.allow_external |= set([normalize_name(line).lower()]) - elif line.startswith("--allow-all-external"): - finder.allow_all_external = True - elif line.startswith("--no-allow-external"): - finder.allow_external = False - elif line.startswith("--no-allow-insecure"): - finder.allow_all_insecure = False - elif line.startswith("--allow-insecure"): - line = line[len("--allow-insecure"):].strip().lstrip("=") - finder.allow_insecure |= set([normalize_name(line).lower()]) - else: - comes_from = '-r %s (line %s)' % (filename, line_number) - if line.startswith('-e') or line.startswith('--editable'): - if line.startswith('-e'): - line = line[2:].strip() - else: - line = line[len('--editable'):].strip().lstrip('=') - req = InstallRequirement.from_editable( - line, comes_from=comes_from, default_vcs=options.default_vcs if options else None) - else: - req = InstallRequirement.from_line(line, comes_from, prereleases=getattr(options, "pre", None)) - yield req - - -def parse_editable(editable_req, default_vcs=None): - """Parses svn+http://blahblah@rev#egg=Foobar into a requirement - (Foobar) and a URL""" - - url = editable_req - extras = None - - # If a file path is specified with extras, strip off the extras. - m = re.match(r'^(.+)(\[[^\]]+\])$', url) - if m: - url_no_extras = m.group(1) - extras = m.group(2) - else: - url_no_extras = url - - if os.path.isdir(url_no_extras): - if not os.path.exists(os.path.join(url_no_extras, 'setup.py')): - raise InstallationError("Directory %r is not installable. File 'setup.py' not found." % url_no_extras) - # 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:'): - if extras: - return None, url_no_extras, pkg_resources.Requirement.parse('__placeholder__' + extras).extras - else: - return None, url_no_extras, None - - for version_control in vcs: - if url.lower().startswith('%s:' % version_control): - url = '%s+%s' % (version_control, url) - if '+' not in url: - if default_vcs: - url = default_vcs + '+' + url - else: - raise InstallationError( - '%s should either by 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) - match = re.search(r'(?:#|#.*?&)egg=([^&]*)', editable_req) - if (not match or not match.group(1)) and vcs.get_backend(vc_type): - parts = [p for p in editable_req.split('#', 1)[0].split('/') if p] - if parts[-2] in ('tags', 'branches', 'tag', 'branch'): - req = parts[-3] - elif parts[-1] == 'trunk': - req = parts[-2] - else: - raise InstallationError( - '--editable=%s is not the right format; it must have #egg=Package' - % editable_req) - else: - req = match.group(1) - ## FIXME: use package_to_requirement? - match = re.search(r'^(.*?)(?:-dev|-\d.*)$', req) - if match: - # Strip off -dev, -0.2, etc. - req = match.group(1) - return req, url, None - - -class UninstallPathSet(object): - """A set of file paths to be removed in the uninstallation of a - requirement.""" - def __init__(self, dist): - self.paths = set() - self._refuse = set() - self.pth = {} - self.dist = dist - self.save_dir = None - self._moved_paths = [] - - def _permitted(self, path): - """ - Return True if the given path is one we are permitted to - remove/modify, False otherwise. - - """ - return is_local(path) - - def _can_uninstall(self): - if not dist_is_local(self.dist): - logger.notify("Not uninstalling %s at %s, outside environment %s" - % (self.dist.project_name, normalize_path(self.dist.location), sys.prefix)) - return False - return True - - def add(self, path): - path = normalize_path(path) - 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(imp.cache_from_source(path)) - - - def add_pth(self, pth_file, entry): - 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 compact(self, paths): - """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.""" - short_paths = set() - for path in sorted(paths, key=len): - if not any([(path.startswith(shortpath) and - path[len(shortpath.rstrip(os.path.sep))] == os.path.sep) - for shortpath in short_paths]): - short_paths.add(path) - return short_paths - - def _stash(self, path): - return os.path.join( - self.save_dir, os.path.splitdrive(path)[1].lstrip(os.path.sep)) - - def remove(self, auto_confirm=False): - """Remove paths in ``self.paths`` with confirmation (unless - ``auto_confirm`` is True).""" - if not self._can_uninstall(): - return - if not self.paths: - logger.notify("Can't uninstall '%s'. No files were found to uninstall." % self.dist.project_name) - return - logger.notify('Uninstalling %s:' % self.dist.project_name) - logger.indent += 2 - paths = sorted(self.compact(self.paths)) - try: - if auto_confirm: - response = 'y' - else: - for path in paths: - logger.notify(path) - response = ask('Proceed (y/n)? ', ('y', 'n')) - if self._refuse: - logger.notify('Not removing or modifying (outside of prefix):') - for path in self.compact(self._refuse): - logger.notify(path) - if response == 'y': - self.save_dir = tempfile.mkdtemp(suffix='-uninstall', - prefix='pip-') - for path in paths: - new_path = self._stash(path) - logger.info('Removing file or directory %s' % path) - self._moved_paths.append(path) - renames(path, new_path) - for pth in self.pth.values(): - pth.remove() - logger.notify('Successfully uninstalled %s' % self.dist.project_name) - - finally: - logger.indent -= 2 - - def rollback(self): - """Rollback the changes previously made by remove().""" - if self.save_dir is None: - logger.error("Can't roll back %s; was not uninstalled" % self.dist.project_name) - return False - logger.notify('Rolling back uninstall of %s' % self.dist.project_name) - for path in self._moved_paths: - tmp_path = self._stash(path) - logger.info('Replacing %s' % path) - renames(tmp_path, path) - for pth in self.pth: - pth.rollback() - - def commit(self): - """Remove temporary save dir: rollback will no longer be possible.""" - if self.save_dir is not None: - rmtree(self.save_dir) - self.save_dir = None - self._moved_paths = [] - - -class UninstallPthEntries(object): - def __init__(self, pth_file): - 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() - self._saved_lines = None - - def add(self, entry): - 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 sys.platform == 'win32' and not os.path.splitdrive(entry)[0]: - entry = entry.replace('\\', '/') - self.entries.add(entry) - - def remove(self): - logger.info('Removing pth entries from %s:' % self.file) - fh = open(self.file, 'rb') - # windows uses '\r\n' with py3k, but uses '\n' with py2.x - lines = fh.readlines() - self._saved_lines = lines - fh.close() - if any(b('\r\n') in line for line in lines): - endline = '\r\n' - else: - endline = '\n' - for entry in self.entries: - try: - logger.info('Removing entry: %s' % entry) - lines.remove(b(entry + endline)) - except ValueError: - pass - fh = open(self.file, 'wb') - fh.writelines(lines) - fh.close() - - def rollback(self): - if self._saved_lines is None: - logger.error('Cannot roll back changes to %s, none were made' % self.file) - return False - logger.info('Rolling %s back to previous state' % self.file) - fh = open(self.file, 'wb') - fh.writelines(self._saved_lines) - fh.close() - return True - - -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 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/req.pyc b/PythonEnv/2.7/Lib/site-packages/pip/req.pyc deleted file mode 100644 index d16778966c9bce9c6a0f27b124f72a2c51c4941e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60020 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 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/util.py b/PythonEnv/2.7/Lib/site-packages/pip/util.py deleted file mode 100644 index 77f9de6ef..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/util.py +++ /dev/null @@ -1,693 +0,0 @@ -import sys -import shutil -import os -import stat -import re -import posixpath -import pkg_resources -import zipfile -import tarfile -import subprocess -import textwrap -from pip.exceptions import InstallationError, BadCommand, PipError -from pip.backwardcompat import(WindowsError, string_types, raw_input, - console_to_str, user_site, PermissionError) -from pip.locations import site_packages, running_under_virtualenv, virtualenv_no_global -from pip.log import logger -from pip.vendor.distlib import version - -__all__ = ['rmtree', 'display_path', 'backup_dir', - 'find_command', 'ask', 'Inf', - 'normalize_name', 'splitext', - 'format_size', 'is_installable_dir', - 'is_svn_page', 'file_contents', - 'split_leading_dir', 'has_leading_dir', - 'make_path_relative', 'normalize_path', - 'renames', 'get_terminal_size', 'get_prog', - 'unzip_file', 'untar_file', 'create_download_cache_folder', - 'cache_download', 'unpack_file', 'call_subprocess'] - - -def get_prog(): - try: - if os.path.basename(sys.argv[0]) in ('__main__.py', '-c'): - return "%s -m pip" % sys.executable - except (AttributeError, TypeError, IndexError): - pass - return 'pip' - - -def rmtree(dir, ignore_errors=False): - 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.""" - exctype, value = exc_info[:2] - if not ((exctype is WindowsError and value.args[0] == 5) or #others - (exctype is OSError and value.args[0] == 13) or #python2.4 - (exctype is PermissionError and value.args[3] == 5) #python3.3 - ): - raise - # file type should currently be read only - if ((os.stat(path).st_mode & stat.S_IREAD) != stat.S_IREAD): - raise - # convert to read/write - os.chmod(path, stat.S_IWRITE) - # use the original function to repeat the operation - func(path) - - -def display_path(path): - """Gives the display value for a given path, making it relative to cwd - if possible.""" - path = os.path.normcase(os.path.abspath(path)) - if path.startswith(os.getcwd() + os.path.sep): - path = '.' + path[len(os.getcwd()):] - return path - - -def backup_dir(dir, ext='.bak'): - """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 find_command(cmd, paths=None, pathext=None): - """Searches the PATH for the given command and returns its path""" - if paths is None: - paths = os.environ.get('PATH', '').split(os.pathsep) - if isinstance(paths, string_types): - paths = [paths] - # check if there are funny path extensions for executables, e.g. Windows - if pathext is None: - pathext = get_pathext() - pathext = [ext for ext in pathext.lower().split(os.pathsep) if len(ext)] - # don't use extensions if the command ends with one of them - if os.path.splitext(cmd)[1].lower() in pathext: - pathext = [''] - # check if we find the command on PATH - for path in paths: - # try without extension first - cmd_path = os.path.join(path, cmd) - for ext in pathext: - # then including the extension - cmd_path_ext = cmd_path + ext - if os.path.isfile(cmd_path_ext): - return cmd_path_ext - if os.path.isfile(cmd_path): - return cmd_path - raise BadCommand('Cannot find command %r' % cmd) - - -def get_pathext(default_pathext=None): - """Returns the path extensions from environment or a default""" - if default_pathext is None: - default_pathext = os.pathsep.join(['.COM', '.EXE', '.BAT', '.CMD']) - pathext = os.environ.get('PATHEXT', default_pathext) - return pathext - - -def ask_path_exists(message, options): - for action in os.environ.get('PIP_EXISTS_ACTION', ''): - if action in options: - return action - return ask(message, options) - - -def ask(message, options): - """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 = raw_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 - - -class _Inf(object): - """I am bigger than everything!""" - - def __eq__(self, other): - if self is other: - return True - else: - return False - - def __ne__(self, other): - return not self.__eq__(other) - - def __lt__(self, other): - return False - - def __le__(self, other): - return False - - def __gt__(self, other): - return True - - def __ge__(self, other): - return True - - def __repr__(self): - return 'Inf' - - -Inf = _Inf() #this object is not currently used as a sortable in our code -del _Inf - - -_normalize_re = re.compile(r'[^a-z]', re.I) - - -def normalize_name(name): - return _normalize_re.sub('-', name.lower()) - - -def format_size(bytes): - 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): - """Return True if `path` is a directory containing a setup.py file.""" - if not os.path.isdir(path): - return False - setup_py = os.path.join(path, 'setup.py') - if os.path.isfile(setup_py): - return True - return False - - -def is_svn_page(html): - """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): - fp = open(filename, 'rb') - try: - return fp.read().decode('utf-8') - finally: - fp.close() - - -def split_leading_dir(path): - path = str(path) - 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): - """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 make_path_relative(path, rel_to): - """ - Make a filename relative, where the filename path, and it is - relative to rel_to - - >>> make_relative_path('/usr/share/something/a-file.pth', - ... '/usr/share/another-place/src/Directory') - '../../../something/a-file.pth' - >>> make_relative_path('/usr/share/something/a-file.pth', - ... '/home/user/src/Directory') - '../../../usr/share/something/a-file.pth' - >>> make_relative_path('/usr/share/a-file.pth', '/usr/share/') - 'a-file.pth' - """ - path_filename = os.path.basename(path) - path = os.path.dirname(path) - path = os.path.normpath(os.path.abspath(path)) - rel_to = os.path.normpath(os.path.abspath(rel_to)) - path_parts = path.strip(os.path.sep).split(os.path.sep) - rel_to_parts = rel_to.strip(os.path.sep).split(os.path.sep) - while path_parts and rel_to_parts and path_parts[0] == rel_to_parts[0]: - path_parts.pop(0) - rel_to_parts.pop(0) - full_parts = ['..']*len(rel_to_parts) + path_parts + [path_filename] - if full_parts == ['']: - return '.' + os.path.sep - return os.path.sep.join(full_parts) - - -def normalize_path(path): - """ - Convert a path to its canonical, case-normalized, absolute version. - - """ - return os.path.normcase(os.path.realpath(path)) - - -def splitext(path): - """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): - """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): - """ - 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): - """ - 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): - """ - Return True if given Distribution is installed in user site. - """ - if user_site: - return normalize_path(dist_location(dist)).startswith(normalize_path(user_site)) - else: - return False - -def dist_in_site_packages(dist): - """ - Return True if given Distribution is installed in distutils.sysconfig.get_python_lib(). - """ - return normalize_path(dist_location(dist)).startswith(normalize_path(site_packages)) - - -def dist_is_editable(dist): - """Is distribution an editable install?""" - #TODO: factor out determining editableness out of FrozenRequirement - from pip import FrozenRequirement - req = FrozenRequirement.from_dist(dist, []) - return req.editable - -def get_installed_distributions(local_only=True, - skip=('setuptools', 'pip', 'python'), - include_editables=True, - editables_only=False): - """ - 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 ('setuptools', 'pip', 'python'). [FIXME also - skip virtualenv?] - - If ``editables`` is False, don't report editables. - - If ``editables_only`` is True , only report editables. - - """ - if local_only: - local_test = dist_is_local - else: - local_test = lambda d: True - - if include_editables: - editable_test = lambda d: True - else: - editable_test = lambda d: not dist_is_editable(d) - - if editables_only: - editables_only_test = lambda d: dist_is_editable(d) - else: - editables_only_test = lambda d: True - - return [d for d in pkg_resources.working_set - if local_test(d) - and d.key not in skip - and editable_test(d) - and editables_only_test(d) - ] - - -def egg_link_path(dist): - """ - 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 - - -def dist_location(dist): - """ - 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 get_terminal_size(): - """Returns a tuple (x, y) representing the width(x) and the height(x) - in characters of the terminal window.""" - def ioctl_GWINSZ(fd): - try: - import fcntl - import termios - import struct - cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, - '1234')) - except: - return None - if cr == (0, 0): - 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: - pass - if not cr: - cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80)) - return int(cr[1]), int(cr[0]) - - -def unzip_file(filename, location, flatten=True): - """Unzip the file (zip file located at filename) to the destination - location""" - if not os.path.exists(location): - os.makedirs(location) - zipfp = open(filename, 'rb') - try: - zip = zipfile.ZipFile(zipfp) - leading = has_leading_dir(zip.namelist()) and flatten - for info in zip.infolist(): - name = info.filename - data = zip.read(name) - fn = name - if leading: - fn = split_leading_dir(name)[1] - fn = os.path.join(location, fn) - dir = os.path.dirname(fn) - if not os.path.exists(dir): - os.makedirs(dir) - if fn.endswith('/') or fn.endswith('\\'): - # A directory - if not os.path.exists(fn): - os.makedirs(fn) - else: - fp = open(fn, 'wb') - try: - fp.write(data) - finally: - fp.close() - unix_attributes = info.external_attr >> 16 - if unix_attributes: - os.chmod(fn, unix_attributes) - - - finally: - zipfp.close() - - -def untar_file(filename, location): - """Untar the file (tar file located at filename) to the destination location""" - if not os.path.exists(location): - os.makedirs(location) - if filename.lower().endswith('.gz') or filename.lower().endswith('.tgz'): - mode = 'r:gz' - elif filename.lower().endswith('.bz2') or filename.lower().endswith('.tbz'): - mode = 'r:bz2' - elif filename.lower().endswith('.tar'): - mode = 'r' - else: - logger.warn('Cannot determine compression type for file %s' % filename) - mode = 'r:*' - tar = tarfile.open(filename, mode) - try: - # note: python<=2.5 doesnt seem to know about pax headers, filter them - leading = has_leading_dir([ - member.name for member in tar.getmembers() - if member.name != 'pax_global_header' - ]) - for member in tar.getmembers(): - fn = member.name - if fn == 'pax_global_header': - continue - if leading: - fn = split_leading_dir(fn)[1] - path = os.path.join(location, fn) - if member.isdir(): - if not os.path.exists(path): - os.makedirs(path) - elif member.issym(): - try: - tar._extract_member(member, path) - except: - e = sys.exc_info()[1] - # Some corrupt tar files seem to produce this - # (specifically bad symlinks) - logger.warn( - 'In the tar file %s the member %s is invalid: %s' - % (filename, member.name, e)) - continue - else: - try: - fp = tar.extractfile(member) - except (KeyError, AttributeError): - e = sys.exc_info()[1] - # Some corrupt tar files seem to produce this - # (specifically bad symlinks) - logger.warn( - 'In the tar file %s the member %s is invalid: %s' - % (filename, member.name, e)) - continue - if not os.path.exists(os.path.dirname(path)): - os.makedirs(os.path.dirname(path)) - destfp = open(path, 'wb') - try: - shutil.copyfileobj(fp, destfp) - finally: - destfp.close() - fp.close() - finally: - tar.close() - - -def create_download_cache_folder(folder): - logger.indent -= 2 - logger.notify('Creating supposed download cache at %s' % folder) - logger.indent += 2 - os.makedirs(folder) - - -def cache_download(target_file, temp_location, content_type): - logger.notify('Storing download in cache at %s' % display_path(target_file)) - shutil.copyfile(temp_location, target_file) - fp = open(target_file+'.content-type', 'w') - fp.write(content_type) - fp.close() - - -def unpack_file(filename, location, content_type, link): - filename = os.path.realpath(filename) - if (content_type == 'application/zip' - or filename.endswith('.zip') - or filename.endswith('.pybundle') - or filename.endswith('.whl') - or zipfile.is_zipfile(filename)): - unzip_file(filename, location, flatten=not filename.endswith(('.pybundle', '.whl'))) - elif (content_type == 'application/x-gzip' - or tarfile.is_tarfile(filename) - or splitext(filename)[1].lower() in ('.tar', '.tar.gz', '.tar.bz2', '.tgz', '.tbz')): - 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.vcs.subversion import Subversion - Subversion('svn+' + link.url).unpack(location) - else: - ## FIXME: handle? - ## FIXME: magic signatures? - logger.fatal('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 call_subprocess(cmd, show_stdout=True, - filter_stdout=None, cwd=None, - raise_on_returncode=True, - command_level=logger.DEBUG, command_desc=None, - extra_environ=None): - if command_desc is None: - cmd_parts = [] - for part in cmd: - if ' ' in part or '\n' in part or '"' in part or "'" in part: - part = '"%s"' % part.replace('"', '\\"') - cmd_parts.append(part) - command_desc = ' '.join(cmd_parts) - if show_stdout: - stdout = None - else: - stdout = subprocess.PIPE - logger.log(command_level, "Running command %s" % command_desc) - env = os.environ.copy() - if extra_environ: - env.update(extra_environ) - try: - proc = subprocess.Popen( - cmd, stderr=subprocess.STDOUT, stdin=None, stdout=stdout, - cwd=cwd, env=env) - except Exception: - e = sys.exc_info()[1] - logger.fatal( - "Error %s while executing command %s" % (e, command_desc)) - raise - all_output = [] - if stdout is not None: - stdout = proc.stdout - while 1: - line = console_to_str(stdout.readline()) - if not line: - break - line = line.rstrip() - all_output.append(line + '\n') - if filter_stdout: - level = filter_stdout(line) - if isinstance(level, tuple): - level, line = level - logger.log(level, line) - if not logger.stdout_level_matches(level): - logger.show_progress() - else: - logger.info(line) - else: - returned_stdout, returned_stderr = proc.communicate() - all_output = [returned_stdout or ''] - proc.wait() - if proc.returncode: - if raise_on_returncode: - if all_output: - logger.notify('Complete output from command %s:' % command_desc) - logger.notify('\n'.join(all_output) + '\n----------------------------------------') - raise InstallationError( - "Command %s failed with error code %s in %s" - % (command_desc, proc.returncode, cwd)) - else: - logger.warn( - "Command %s had error code %s in %s" - % (command_desc, proc.returncode, cwd)) - if stdout is not None: - return ''.join(all_output) - - -def is_prerelease(vers): - """ - Attempt to determine if this is a pre-release using PEP386/PEP426 rules. - - Will return True if it is a pre-release and False if not. Versions are - assumed to be a pre-release if they cannot be parsed. - """ - normalized = version.suggest_normalized_version(vers) - - if normalized is None: - # Cannot normalize, assume it is a pre-release - return True - - parsed = version.normalized_key(normalized) - return any([any([y in set(["a", "b", "c", "rc", "dev"]) for y in x]) for x in parsed]) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/util.pyc b/PythonEnv/2.7/Lib/site-packages/pip/util.pyc deleted file mode 100644 index f1e08075493ce8a332d302d19c6114e804b293d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26305 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 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vcs/__init__.py deleted file mode 100644 index a56dd202b..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vcs/__init__.py +++ /dev/null @@ -1,251 +0,0 @@ -"""Handles all VCS (version control) support""" - -import os -import shutil - -from pip.backwardcompat import urlparse, urllib -from pip.log import logger -from pip.util import (display_path, backup_dir, find_command, - rmtree, ask_path_exists) - - -__all__ = ['vcs', 'get_src_requirement'] - - -class VcsSupport(object): - _registry = {} - schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] - - def __init__(self): - # Register more schemes with urlparse for various version control systems - urlparse.uses_netloc.extend(self.schemes) - # Python >= 2.7.4, 3.3 doesn't have uses_fragment - if getattr(urlparse, 'uses_fragment', None): - urlparse.uses_fragment.extend(self.schemes) - super(VcsSupport, self).__init__() - - def __iter__(self): - return self._registry.__iter__() - - @property - def backends(self): - return list(self._registry.values()) - - @property - def dirnames(self): - return [backend.dirname for backend in self.backends] - - @property - def all_schemes(self): - schemes = [] - for backend in self.backends: - schemes.extend(backend.schemes) - return schemes - - def register(self, cls): - if not hasattr(cls, 'name'): - logger.warn('Cannot register VCS %s' % cls.__name__) - return - if cls.name not in self._registry: - self._registry[cls.name] = cls - - def unregister(self, cls=None, name=None): - if name in self._registry: - del self._registry[name] - elif cls in self._registry.values(): - del self._registry[cls.name] - else: - logger.warn('Cannot unregister because no class or name given') - - def get_backend_name(self, location): - """ - Return the name of the version control backend if found at given - location, e.g. vcs.get_backend_name('/path/to/vcs/checkout') - """ - for vc_type in self._registry.values(): - path = os.path.join(location, vc_type.dirname) - if os.path.exists(path): - return vc_type.name - return None - - def get_backend(self, name): - name = name.lower() - if name in self._registry: - return self._registry[name] - - def get_backend_from_location(self, location): - vc_type = self.get_backend_name(location) - if vc_type: - return self.get_backend(vc_type) - return None - - -vcs = VcsSupport() - - -class VersionControl(object): - name = '' - dirname = '' - - def __init__(self, url=None, *args, **kwargs): - self.url = url - self._cmd = None - super(VersionControl, self).__init__(*args, **kwargs) - - def _filter(self, line): - return (logger.INFO, line) - - def _is_local_repository(self, repo): - """ - posix absolute paths start with os.path.sep, - win32 ones ones start with drive (like c:\\folder) - """ - drive, tail = os.path.splitdrive(repo) - return repo.startswith(os.path.sep) or drive - - @property - def cmd(self): - if self._cmd is not None: - return self._cmd - command = find_command(self.name) - logger.info('Found command %r at %r' % (self.name, command)) - self._cmd = command - return command - - def get_url_rev(self): - """ - Returns the correct repository URL and revision by parsing the given - repository URL - """ - error_message = ( - "Sorry, '%s' is a malformed VCS url. " - "The format is <vcs>+<protocol>://<url>, " - "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp") - assert '+' in self.url, error_message % self.url - url = self.url.split('+', 1)[1] - scheme, netloc, path, query, frag = urlparse.urlsplit(url) - rev = None - if '@' in path: - path, rev = path.rsplit('@', 1) - url = urlparse.urlunsplit((scheme, netloc, path, query, '')) - return url, rev - - def get_info(self, location): - """ - Returns (url, revision), where both are strings - """ - assert not location.rstrip('/').endswith(self.dirname), 'Bad directory: %s' % location - return self.get_url(location), self.get_revision(location) - - def normalize_url(self, url): - """ - Normalize a URL for comparison by unquoting it and removing any trailing slash. - """ - return urllib.unquote(url).rstrip('/') - - def compare_urls(self, url1, url2): - """ - Compare two repo URLs for identity, ignoring incidental differences. - """ - return (self.normalize_url(url1) == self.normalize_url(url2)) - - def parse_vcs_bundle_file(self, content): - """ - Takes the contents of the bundled text file that explains how to revert - the stripped off version control data of the given package and returns - the URL and revision of it. - """ - raise NotImplementedError - - def obtain(self, dest): - """ - Called when installing or updating an editable package, takes the - source path of the checkout. - """ - raise NotImplementedError - - def switch(self, dest, url, rev_options): - """ - Switch the repo at ``dest`` to point to ``URL``. - """ - raise NotImplemented - - def update(self, dest, rev_options): - """ - Update an already-existing repo to the given ``rev_options``. - """ - raise NotImplementedError - - def check_destination(self, dest, url, rev_options, rev_display): - """ - Prepare a location to receive a checkout/clone. - - Return True if the location is ready for (and requires) a - checkout/clone, False otherwise. - """ - checkout = True - prompt = False - if os.path.exists(dest): - checkout = False - if os.path.exists(os.path.join(dest, self.dirname)): - existing_url = self.get_url(dest) - if self.compare_urls(existing_url, url): - logger.info('%s in %s exists, and has correct URL (%s)' % - (self.repo_name.title(), display_path(dest), - url)) - logger.notify('Updating %s %s%s' % - (display_path(dest), self.repo_name, - rev_display)) - self.update(dest, rev_options) - else: - logger.warn('%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.warn('Directory %s already exists, ' - 'and is not a %s %s.' % - (dest, self.name, self.repo_name)) - prompt = ('(i)gnore, (w)ipe, (b)ackup ', ('i', 'w', 'b')) - if prompt: - logger.warn('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 == 's': - logger.notify('Switching %s %s to %s%s' % - (self.repo_name, display_path(dest), url, - rev_display)) - self.switch(dest, url, rev_options) - elif response == 'i': - # do nothing - pass - elif response == 'w': - logger.warn('Deleting %s' % display_path(dest)) - rmtree(dest) - checkout = True - elif response == 'b': - dest_dir = backup_dir(dest) - logger.warn('Backing up %s to %s' - % (display_path(dest), dest_dir)) - shutil.move(dest, dest_dir) - checkout = True - return checkout - - def unpack(self, location): - if os.path.exists(location): - rmtree(location) - self.obtain(location) - - def get_src_requirement(self, dist, location, find_tags=False): - raise NotImplementedError - - -def get_src_requirement(dist, location, find_tags): - version_control = vcs.get_backend_from_location(location) - if version_control: - return version_control().get_src_requirement(dist, location, find_tags) - logger.warn('cannot determine version of editable source in %s (is not SVN checkout, Git clone, Mercurial clone or Bazaar branch)' % location) - return dist.as_requirement() diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vcs/__init__.pyc deleted file mode 100644 index 31a709c7cef72d441065d846444ff6c1ec1e2412..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11818 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 K*sibt@_zyQL%5#+ diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/bazaar.py b/PythonEnv/2.7/Lib/site-packages/pip/vcs/bazaar.py deleted file mode 100644 index 86f4bbc62..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vcs/bazaar.py +++ /dev/null @@ -1,131 +0,0 @@ -import os -import tempfile -import re -from pip.backwardcompat import urlparse -from pip.log import logger -from pip.util import rmtree, display_path, call_subprocess -from pip.vcs import vcs, VersionControl -from pip.download import path_to_url2 - - -class Bazaar(VersionControl): - name = 'bzr' - dirname = '.bzr' - repo_name = 'branch' - bundle_file = 'bzr-branch.txt' - schemes = ('bzr', 'bzr+http', 'bzr+https', 'bzr+ssh', 'bzr+sftp', 'bzr+ftp', 'bzr+lp') - guide = ('# This was a Bazaar branch; to make it a branch again run:\n' - 'bzr branch -r %(rev)s %(url)s .\n') - - def __init__(self, url=None, *args, **kwargs): - super(Bazaar, self).__init__(url, *args, **kwargs) - # Python >= 2.7.4, 3.3 doesn't have uses_fragment or non_hierarchical - # Register lp but do not expose as a scheme to support bzr+lp. - if getattr(urlparse, 'uses_fragment', None): - urlparse.uses_fragment.extend(['lp']) - urlparse.non_hierarchical.extend(['lp']) - - def parse_vcs_bundle_file(self, content): - url = rev = None - for line in content.splitlines(): - if not line.strip() or line.strip().startswith('#'): - continue - match = re.search(r'^bzr\s*branch\s*-r\s*(\d*)', line) - if match: - rev = match.group(1).strip() - url = line[match.end():].strip().split(None, 1)[0] - if url and rev: - return url, rev - return None, None - - def export(self, location): - """Export the Bazaar repository at the url to the destination location""" - temp_dir = tempfile.mkdtemp('-export', 'pip-') - self.unpack(temp_dir) - if os.path.exists(location): - # Remove the location to make sure Bazaar can export it correctly - rmtree(location) - try: - call_subprocess([self.cmd, 'export', location], cwd=temp_dir, - filter_stdout=self._filter, show_stdout=False) - finally: - rmtree(temp_dir) - - def switch(self, dest, url, rev_options): - call_subprocess([self.cmd, 'switch', url], cwd=dest) - - def update(self, dest, rev_options): - call_subprocess( - [self.cmd, 'pull', '-q'] + rev_options, cwd=dest) - - def obtain(self, dest): - url, rev = self.get_url_rev() - if rev: - rev_options = ['-r', rev] - rev_display = ' (to revision %s)' % rev - else: - rev_options = [] - rev_display = '' - if self.check_destination(dest, url, rev_options, rev_display): - logger.notify('Checking out %s%s to %s' - % (url, rev_display, display_path(dest))) - call_subprocess( - [self.cmd, 'branch', '-q'] + rev_options + [url, dest]) - - def get_url_rev(self): - # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it - url, rev = super(Bazaar, self).get_url_rev() - if url.startswith('ssh://'): - url = 'bzr+' + url - return url, rev - - def get_url(self, location): - urls = call_subprocess( - [self.cmd, '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 self._is_local_repository(repo): - return path_to_url2(repo) - return repo - return None - - def get_revision(self, location): - revision = call_subprocess( - [self.cmd, 'revno'], show_stdout=False, cwd=location) - return revision.splitlines()[-1] - - def get_tag_revs(self, location): - tags = call_subprocess( - [self.cmd, 'tags'], show_stdout=False, cwd=location) - tag_revs = [] - for line in tags.splitlines(): - tags_match = re.search(r'([.\w-]+)\s*(.*)$', line) - if tags_match: - tag = tags_match.group(1) - rev = tags_match.group(2) - tag_revs.append((rev.strip(), tag.strip())) - return dict(tag_revs) - - def get_src_requirement(self, dist, location, find_tags): - repo = self.get_url(location) - if not repo.lower().startswith('bzr:'): - repo = 'bzr+' + repo - egg_project_name = dist.egg_name().split('-', 1)[0] - if not repo: - return None - current_rev = self.get_revision(location) - tag_revs = self.get_tag_revs(location) - - if current_rev in tag_revs: - # It's a tag - full_egg_name = '%s-%s' % (egg_project_name, tag_revs[current_rev]) - else: - full_egg_name = '%s-dev_r%s' % (dist.egg_name(), current_rev) - return '%s@%s#egg=%s' % (repo, current_rev, full_egg_name) - - -vcs.register(Bazaar) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/bazaar.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vcs/bazaar.pyc deleted file mode 100644 index 363ce4d46609090be406cfbe7a3194eddb19a0bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6339 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 X97844kWAFP75v@w*1VPS+Q~lw)3#q_ diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/git.py b/PythonEnv/2.7/Lib/site-packages/pip/vcs/git.py deleted file mode 100644 index 16acebdc4..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vcs/git.py +++ /dev/null @@ -1,194 +0,0 @@ -import tempfile -import re -import os.path -from pip.util import call_subprocess -from pip.util import display_path, rmtree -from pip.vcs import vcs, VersionControl -from pip.log import logger -from pip.backwardcompat import url2pathname, urlparse -urlsplit = urlparse.urlsplit -urlunsplit = urlparse.urlunsplit - - -class Git(VersionControl): - name = 'git' - dirname = '.git' - repo_name = 'clone' - schemes = ('git', 'git+http', 'git+https', 'git+ssh', 'git+git', 'git+file') - bundle_file = 'git-clone.txt' - guide = ('# This was a Git repo; to make it a repo again run:\n' - 'git init\ngit remote add origin %(url)s -f\ngit checkout %(rev)s\n') - - def __init__(self, url=None, *args, **kwargs): - - # Works around an apparent Git bug - # (see http://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 + 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) - - def parse_vcs_bundle_file(self, content): - url = rev = None - for line in content.splitlines(): - if not line.strip() or line.strip().startswith('#'): - continue - url_match = re.search(r'git\s*remote\s*add\s*origin(.*)\s*-f', line) - if url_match: - url = url_match.group(1).strip() - rev_match = re.search(r'^git\s*checkout\s*-q\s*(.*)\s*', line) - if rev_match: - rev = rev_match.group(1).strip() - if url and rev: - return url, rev - return None, None - - def export(self, location): - """Export the Git repository at the url to the destination location""" - temp_dir = tempfile.mkdtemp('-export', 'pip-') - self.unpack(temp_dir) - try: - if not location.endswith('/'): - location = location + '/' - call_subprocess( - [self.cmd, 'checkout-index', '-a', '-f', '--prefix', location], - filter_stdout=self._filter, show_stdout=False, cwd=temp_dir) - finally: - rmtree(temp_dir) - - def check_rev_options(self, rev, dest, rev_options): - """Check the revision options before checkout to compensate that tags - and branches may need origin/ as a prefix. - Returns the SHA1 of the branch or tag if found. - """ - revisions = self.get_refs(dest) - - origin_rev = 'origin/%s' % rev - if origin_rev in revisions: - # remote branch - return [revisions[origin_rev]] - elif rev in revisions: - # a local tag or branch name - return [revisions[rev]] - else: - logger.warn("Could not find a tag or branch '%s', assuming commit." % rev) - return rev_options - - def switch(self, dest, url, rev_options): - call_subprocess( - [self.cmd, 'config', 'remote.origin.url', url], cwd=dest) - call_subprocess( - [self.cmd, 'checkout', '-q'] + rev_options, cwd=dest) - - self.update_submodules(dest) - - def update(self, dest, rev_options): - # First fetch changes from the default remote - call_subprocess([self.cmd, 'fetch', '-q'], cwd=dest) - # Then reset to wanted revision (maby even origin/master) - if rev_options: - rev_options = self.check_rev_options(rev_options[0], dest, rev_options) - call_subprocess([self.cmd, 'reset', '--hard', '-q'] + rev_options, cwd=dest) - #: update submodules - self.update_submodules(dest) - - def obtain(self, dest): - url, rev = self.get_url_rev() - if rev: - rev_options = [rev] - rev_display = ' (to %s)' % rev - else: - rev_options = ['origin/master'] - rev_display = '' - if self.check_destination(dest, url, rev_options, rev_display): - logger.notify('Cloning %s%s to %s' % (url, rev_display, display_path(dest))) - call_subprocess([self.cmd, 'clone', '-q', url, dest]) - #: repo may contain submodules - self.update_submodules(dest) - if rev: - rev_options = self.check_rev_options(rev, dest, rev_options) - # Only do a checkout if rev_options differs from HEAD - if not self.get_revision(dest).startswith(rev_options[0]): - call_subprocess([self.cmd, 'checkout', '-q'] + rev_options, cwd=dest) - - def get_url(self, location): - url = call_subprocess( - [self.cmd, 'config', 'remote.origin.url'], - show_stdout=False, cwd=location) - return url.strip() - - def get_revision(self, location): - current_rev = call_subprocess( - [self.cmd, 'rev-parse', 'HEAD'], show_stdout=False, cwd=location) - return current_rev.strip() - - def get_refs(self, location): - """Return map of named refs (branches or tags) to commit hashes.""" - output = call_subprocess([self.cmd, 'show-ref'], - show_stdout=False, cwd=location) - rv = {} - for line in output.strip().splitlines(): - commit, ref = line.split(' ', 1) - ref = ref.strip() - ref_name = None - if ref.startswith('refs/remotes/'): - ref_name = ref[len('refs/remotes/'):] - elif ref.startswith('refs/heads/'): - ref_name = ref[len('refs/heads/'):] - elif ref.startswith('refs/tags/'): - ref_name = ref[len('refs/tags/'):] - if ref_name is not None: - rv[ref_name] = commit.strip() - return rv - - def get_src_requirement(self, dist, location, find_tags): - repo = self.get_url(location) - if not repo.lower().startswith('git:'): - repo = 'git+' + repo - egg_project_name = dist.egg_name().split('-', 1)[0] - if not repo: - return None - current_rev = self.get_revision(location) - refs = self.get_refs(location) - # refs maps names to commit hashes; we need the inverse - # if multiple names map to a single commit, this arbitrarily picks one - names_by_commit = dict((commit, ref) for ref, commit in refs.items()) - - if current_rev in names_by_commit: - # It's a tag - full_egg_name = '%s-%s' % (egg_project_name, names_by_commit[current_rev]) - else: - full_egg_name = '%s-dev' % egg_project_name - - return '%s@%s#egg=%s' % (repo, current_rev, full_egg_name) - - def get_url_rev(self): - """ - Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. - That's required because although they use SSH they sometimes doesn'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 self.url: - assert not 'file:' in self.url - self.url = self.url.replace('git+', 'git+ssh://') - url, rev = super(Git, self).get_url_rev() - url = url.replace('ssh://', '') - else: - url, rev = super(Git, self).get_url_rev() - - return url, rev - - def update_submodules(self, location): - if not os.path.exists(os.path.join(location, '.gitmodules')): - return - call_subprocess([self.cmd, 'submodule', 'update', '--init', '--recursive', '-q'], - cwd=location) - -vcs.register(Git) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/git.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vcs/git.pyc deleted file mode 100644 index 8a7d3343b144eafc92e367da0b81f6e8b4e922e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8737 zcmcgy&vP6{74F&9uhp-$<=C=gCz-@iw2rf@B!o(#IKhtX*afL2j7&@xg=MtUyF1eC z%xZd8KPZU<4mXM_4sfR`oT%bJ5l&Qb;6yI)XHZ-@a7b0)`(DrPiU36cg=9^uyXQ@J z&+G4f@AVrO|GY5!qdykBmdbyM_<IwV`3;HyzmAHOYK-cRYB<CGf@&0{UQp45>P@P~ zq;mL7QQA|gF{OIbsxfVQCsZ_}dL`8;sotz=%-Y^b70s#MylTwb_LPbiRBur=7FDmT z8fE3^vf4hQ8fO$MXI0~@3Z|8wRc$O}Mtz{vBc<MJEGb=5+vk*CQjZ)A<*1EH3GWd8 z6+iWggKAbr(ek6HX$D*UG-+vLDh1w{M-hakANhyPzMploDRiX0EY;cyP%V2clP%)! zyE-*t65meZEKMRiGUcPB)6wa8z(E?l%)w&6r?VLdprh}nMrR!DUYND;M}GM9o4Cw} zC^Xb9DsB|0eX1CWo>0Lu^@}%#Rs(2pS_KzXFsnX*Oi2ZE)C80o%u8iX1q)J{SHYrG z7F1A{%AyL+NTsZTvr;*uf+eXywdbU=q=Lt!a!v*3rSg~xE=c9P@-`}$uuyr8PMDbq zG-{}1lc=<!B-Vzni=OM<EbAL?!>D1V^OiB)QJtd<A8Ch?HVam$Dx=l1gUlH8Ty-CG zL*wrI#`WEMVdkc~pS<Q~iQDscw2Ka3x?I2Ghq0Ru;`Lb!?S^rfNhQ_2B-5@R1a6Xs z9muRyuq)S$TWyO#tE*c($sj|2s`sv$*%t9ZcyQTY!Dar0;>c0y$10Nw(6%|LjwjSH z$|-d`t&V5Z(S+K@COX6-B#)+4R$#d;yNOQx&bh}WbyQN>1n;0@8{2E|7si6i$FmA> z#DGVW>S$ISO{=3B)t=-7$Bs+{BuuawOseJMIT4*xZvN1mdg>n^T*i~TAFCLfIHNMG z0!D;6F*-)XLW}ALv>^o>A~x$-qEg(LjCQnUSZ+%FddPZZ4#g1TFe6}r+o|Kg?1wNX z0zT5Qm{nx5H0*mEH=|OqhmqgX*(~bVi$QFkw=>3pfXWQ|I`ufDjN5E-N1M$GH%8WG zbkvqvFoJaWX~)QPJNu)m!S2EoIdiPDC~1kL*gKKCJJ9K&jNeZEP7li!!r)Y)56*~u z)73`S9P52~jBEDWnNFMiXkaR6DJjgms0Hhr0AF{owfQiNZ$<4?2PbM<VZ3=qZw)$| z?;K{`B)%K(ZN6N4b@T0TYtw|8uJ--bj^EK{vmf?1!95(T)<5(vU}#=u35A-NaxOb% z=W%BRf6qD9f&i9!<tyFBWqykSTRCxDP{&1e@C$A-!1+k2JMVu;;1a9_w&%_AxIw5| z{N7c&%Yqfi0iwVM;D*6~$4QkASZ;%pih^Mo2vZSTR$eBcJWxEP(w~YQd`7-Vc_1&v z0*X=!3fl#>fw><7*+V1}Zdc8-D4~x{^Sm`_RAAI7tyx!U&tF5M+7@)0Cn5b!D?T)E z-rYr!OA2e(>lG?aP*Deq2_yxLQ3y`6NF;dejm%Fo3vY5nYJp|6pSHRp+DVf^Uq<wn zIV{I+!D#?k-bHp4<*_}Pk2Am!#RQr?Kf@SofrM=9RIrtu$CTotngCpLYY+#KZqn{o zaKk)~LOHX5*)z_RvxMtnUd}s<jsTCZL^HjO%X|+7IMNa!U_%UGThW6OO;F6Y9|#%& zH9?PggH6;)P!>TH2k7AcPy#ieKSy;?0m<SPDqv7BAh?S|7M+K1g|Om$g0G{sAv|Gj zVmWsY`bnC(Syzwz2aGLA4_)8(f<Nd_C=g)F!`RQ@>s^qARK#OdwTvQu55`&bNJC~3 z#SmT9Fb?#AAug)E{nHi)SFQF_-3|{jIyfkn)M2s!9w#G(nr^Z`Y*Ur3{h%&UjL=f1 zdwn5cBB{3%uq|vhh)EV6!y6BmMOLd92;{hbm_{J^mLD1Iaak1(Z*j@}8ou9Xo@NlH zr-M1tu~q0Rs99DkEIA9<%CeM~oyQ9;x&umb*#fR_p+W!%ZO|72A#h%fx?p(;9JK?s zc~RWqq`K5WK#03}_dV%$Y&RSk5J_Ic(?lgGXagYJsBl*ED^AI{Ku`gT3>p5pNuS6t z?v`#Rsdk53PxQ2sUSG$?N2rl?2`s;3X5IY9j{|or^<z9>5Vst<vDU+IWX+Y(#$u#4 zdc@P&AjMQf<;MM6FS$uu>UJ1}GMvE;+ip97$&R0s$jdU~+KMrs=ZhqRC~)H>bKAhE z>&ufEARlUV#jL)7MVLV^j5~ah9=uLn&?4CA=&T6@8;|Zqm<#?jmMB5c<h?NLr}+q| z$zi#&hMXoEG(w|xc^Gr=bl`Rt>yy3Wl*4u1LZ>-{LQR$nv(9{Bj#uHVBe)|9M&9%t zG#K~+dJ^CfHU-rI`ijKQBgb*Zw}rJjxB*5R-{-ReHexLp2U)~797H?p7_QQKwwhH? z4aDSqj&svohhVeRvTKbQ{mOflB7Az#4}d?Obb3iJKu9fMwtMtNO40>+H&L99-uZI$ zmaXmvYmA%}O#BM2Ckic^HLsDHQ#8hUgr=cm@e;X?q4N~Z!fF!6JE1Poy5RzfbTafE zqfN4oLpBKlpV^3f*Yb@Zv(|+w+Zs#F^(%@GaZAaqRO1Y1_(Iic*G~hhS>6`)d*mnY zEfiyt^+e@2*@x@@9wb_?APD#drnA~ETq#UJ-&bvj$mR3mVod>2l_k?h2<*j8BUEH0 zR$~e7%;~i#^cv&j2zA<C=o^8cn1kH`P%I+CM-wXjl&2oXk>~;7CrKExf2xgvh<@mk zkHU+~CQ%CBT@E)6Z-}?gDH+4D3$9)Ej6o>o#)#;|5k_KF9${c~)9Ml)GM{k2^6_UF zJ<t><fPh@wadtmZyPpy*Vul1|UHr6L0gbPiYjP0H8MNmc`ccSOFLfIyU6SOASphXu z+~WW_W&|$YU33U~><NiJo(u|OCjE$^S~5BjY*=dL-higV_Myj+SNyt#7m+0xleC2; zWb2c>Roptk#bY}sD~qv@7&%XOoE{vLtqg~9jfI#iD3pYbC1;^fl0edRt`rtfJ72gm z4kbqbt>J;OL7$)l0F3D3<`)=T3f=(XjS8ux?%hH8FWB^D+_HN^f<K|)FR=L>iWBy` z&OTD+=_rgmlmq1eRly|batSffDA4|&wIlHXaEP-e(^6E!{kymBc>l3x1XZm;n&ND8 zYOdU4I_5jn4i!P|JZ*I|gVsnle?j9Uayk;}5jHvV6E-kb9*uuD#?Lm`g$Lx1h6m)~ z83czI5~SpMY(fWeINE|!kosW{4kMDzNx#n~{IzX9h1>C+p~N(gKk3hh64DfjXND3p zBJqczgfvA0RE;T0YNw>qbvb<F?1WCd&$PO+yRPv25Uq`h(9!EqfDIrKZT1;DG9ekb zjN;tNC=#_nq`8*IuL%3xt|UBa0zRHhs(56K4N3pF_JGaP498ouF^gF<WIE~TYCk}m zOOZBX;Wc}x`DZ5Qtw2z`tQ@?(XVDZ|^BA60xV1Khp+Sn9!`Z2i<CC1h_q^(`+lH?B z8M`e}6XtL7-A~1YJ?b6XqKu0|;Y3pgyIsPOc^-euI7APxd1u*?IFmY}4c^9Oevg8# z3#A;D^E?fR4xK=+xI6Pwo{m|@ZFn*8Alxk_BpwAb0<Lham*}D=lzAwA&U(arSR`d2 z4&>TdrgOl4fWfBeS25TfKo!4CYeITP&Q-sZlQ>3|&PzztTtGH6M*bNclhUA<1vTT5 zlK6Xz$GRMwk&Ia%R;~+@s)8i(nk_oKVtz62Yo4~scz;=J4@(iI$J=7wcb#2C7-W1t zR=1nWrv(zV7d?EuP~LkePG#SPQ*U&1j5BTe#!oP<1O!vc&>^juDh^^KC)5JHXP7!z zF*jGtRo&^lzGB2?Jz9nsL6qzx@kzHX2!@Ox*kgXt+6GBbuqN~!ge{wfM+UK%4<^Yc z;tDQ5^TcjSXz~2lq&3Qe%%o>DF;0PRBip)_*{L3&GZ$$a$%xX1kR3W~<~Am|i~&BY z43~E*iq6hqVf2wEZNca44nmL*{Lhckou{hG&Us`IuE5?VU~T2%mBM^sxiDM!JAmD$ z{0~tueIN$6Gp*7{3~Sg#z7Zh(?ofdCCs8e|3y(CRprXXKHjR$()ke`4s5ZMG@h#+; z*t-00<Y9}<d`j-nyarg0G6C;^!@>h34oo)Ka=+%iZQLltr;pWv(do@@Vlr;dI$Pl4 ze!|Z(t1ff!?kYaGtgo%Dj?)7VkegUFa0H?|WF>UV$CIufAt62JbeUr~blJ19ao;vf zf&_Yq?RSGjn|L)Ft!zI@ckD#IYiDw8zTK_pTBpWz8&cudYVMo(y0Wir)&rsle|s8< zi*z&+gAv5lHTS-bTbi=;Dtq?(j(pgWlsobc0lotviGkEB(j)TuhaZNhn(<2-QUTsu z%#Yc#G4F^|f`YEw^@>^As`q6)WCLl*)GnfV%Rs42`P@y@B=wfi<uP9>pC!Dv`2eS~ z-boJE47yLn6lC_FVKzxZs%hf>BEAQlFI={VJvv8*l(#8UM}de4=?maEuShIJpCVqs ztO%jP>S+)_?hx<xl*a69elT-v{$d70*2U)&aCyQ(l0BpRgZCxQP3Eg2JBsgpj1Z~_ zDG)ZAa8I8+YK!KDz7yj;0XcE>`T+c8*=jop<8kyL$@_6sa5^e~3(NX7t~@k<8Wi)S zBMTSAK@D<;@cJ)5g4Qei%p<(t6e?~uC1ciXS_Pv?R;R&Bq8AxksgvAk`|^z3u|{Sj zN<Wd*7Z1}Jgn_oMgwuI1vbe#5VDav;;MRFxWkID&+$}E0qq`RH*>ne5rv!Kcj&8?1 zhhho@Kl)dkFPF-th0;=KrZihRSDGqKqC8(ZTX_tk-YYDK5K&BGYW$ApMeN|1NaxoE zSr}PxF`$raxd`(fK8tu_<<$JB7hnGEp`D~au`Q(I$xloK`<Z;}^k{z`iNvGh8h^}8 qbqBb{e;h#X>1a>h^o9k|8+=E@ou5ZwI`5ouF5n-_l2a;P_~>uFP?xO$ diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/mercurial.py b/PythonEnv/2.7/Lib/site-packages/pip/vcs/mercurial.py deleted file mode 100644 index af427f77e..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vcs/mercurial.py +++ /dev/null @@ -1,151 +0,0 @@ -import os -import tempfile -import re -import sys -from pip.util import call_subprocess -from pip.util import display_path, rmtree -from pip.log import logger -from pip.vcs import vcs, VersionControl -from pip.download import path_to_url2 -from pip.backwardcompat import ConfigParser - - -class Mercurial(VersionControl): - name = 'hg' - dirname = '.hg' - repo_name = 'clone' - schemes = ('hg', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http') - bundle_file = 'hg-clone.txt' - guide = ('# This was a Mercurial repo; to make it a repo again run:\n' - 'hg init\nhg pull %(url)s\nhg update -r %(rev)s\n') - - def parse_vcs_bundle_file(self, content): - url = rev = None - for line in content.splitlines(): - if not line.strip() or line.strip().startswith('#'): - continue - url_match = re.search(r'hg\s*pull\s*(.*)\s*', line) - if url_match: - url = url_match.group(1).strip() - rev_match = re.search(r'^hg\s*update\s*-r\s*(.*)\s*', line) - if rev_match: - rev = rev_match.group(1).strip() - if url and rev: - return url, rev - return None, None - - def export(self, location): - """Export the Hg repository at the url to the destination location""" - temp_dir = tempfile.mkdtemp('-export', 'pip-') - self.unpack(temp_dir) - try: - call_subprocess( - [self.cmd, 'archive', location], - filter_stdout=self._filter, show_stdout=False, cwd=temp_dir) - finally: - rmtree(temp_dir) - - 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) - config_file = open(repo_config, 'w') - config.write(config_file) - config_file.close() - except (OSError, ConfigParser.NoSectionError): - e = sys.exc_info()[1] - logger.warn( - 'Could not switch Mercurial repository to %s: %s' - % (url, e)) - else: - call_subprocess([self.cmd, 'update', '-q'] + rev_options, cwd=dest) - - def update(self, dest, rev_options): - call_subprocess([self.cmd, 'pull', '-q'], cwd=dest) - call_subprocess( - [self.cmd, 'update', '-q'] + rev_options, cwd=dest) - - def obtain(self, dest): - url, rev = self.get_url_rev() - if rev: - rev_options = [rev] - rev_display = ' (to revision %s)' % rev - else: - rev_options = [] - rev_display = '' - if self.check_destination(dest, url, rev_options, rev_display): - logger.notify('Cloning hg %s%s to %s' - % (url, rev_display, display_path(dest))) - call_subprocess([self.cmd, 'clone', '--noupdate', '-q', url, dest]) - call_subprocess([self.cmd, 'update', '-q'] + rev_options, cwd=dest) - - def get_url(self, location): - url = call_subprocess( - [self.cmd, 'showconfig', 'paths.default'], - show_stdout=False, cwd=location).strip() - if self._is_local_repository(url): - url = path_to_url2(url) - return url.strip() - - def get_tag_revs(self, location): - tags = call_subprocess( - [self.cmd, 'tags'], show_stdout=False, cwd=location) - tag_revs = [] - for line in tags.splitlines(): - tags_match = re.search(r'([\w\d\.-]+)\s*([\d]+):.*$', line) - if tags_match: - tag = tags_match.group(1) - rev = tags_match.group(2) - if "tip" != tag: - tag_revs.append((rev.strip(), tag.strip())) - return dict(tag_revs) - - def get_branch_revs(self, location): - branches = call_subprocess( - [self.cmd, 'branches'], show_stdout=False, cwd=location) - branch_revs = [] - for line in branches.splitlines(): - branches_match = re.search(r'([\w\d\.-]+)\s*([\d]+):.*$', line) - if branches_match: - branch = branches_match.group(1) - rev = branches_match.group(2) - if "default" != branch: - branch_revs.append((rev.strip(), branch.strip())) - return dict(branch_revs) - - def get_revision(self, location): - current_revision = call_subprocess( - [self.cmd, 'parents', '--template={rev}'], - show_stdout=False, cwd=location).strip() - return current_revision - - def get_revision_hash(self, location): - current_rev_hash = call_subprocess( - [self.cmd, 'parents', '--template={node}'], - show_stdout=False, cwd=location).strip() - return current_rev_hash - - def get_src_requirement(self, dist, location, find_tags): - repo = self.get_url(location) - if not repo.lower().startswith('hg:'): - repo = 'hg+' + repo - egg_project_name = dist.egg_name().split('-', 1)[0] - if not repo: - return None - current_rev = self.get_revision(location) - current_rev_hash = self.get_revision_hash(location) - tag_revs = self.get_tag_revs(location) - branch_revs = self.get_branch_revs(location) - if current_rev in tag_revs: - # It's a tag - full_egg_name = '%s-%s' % (egg_project_name, tag_revs[current_rev]) - elif current_rev in branch_revs: - # It's the tip of a branch - full_egg_name = '%s-%s' % (egg_project_name, branch_revs[current_rev]) - else: - full_egg_name = '%s-dev' % egg_project_name - return '%s@%s#egg=%s' % (repo, current_rev_hash, full_egg_name) - -vcs.register(Mercurial) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/mercurial.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vcs/mercurial.pyc deleted file mode 100644 index 7b388790f1d26048cfb5cd53db128f8b5613b30d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7095 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 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/subversion.py b/PythonEnv/2.7/Lib/site-packages/pip/vcs/subversion.py deleted file mode 100644 index 88163ff73..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vcs/subversion.py +++ /dev/null @@ -1,273 +0,0 @@ -import os -import re -from pip.backwardcompat import urlparse -from pip.index import Link -from pip.util import rmtree, display_path, call_subprocess -from pip.log import logger -from pip.vcs import vcs, VersionControl - -_svn_xml_url_re = re.compile('url="([^"]+)"') -_svn_rev_re = re.compile('committed-rev="(\d+)"') -_svn_url_re = re.compile(r'URL: (.+)') -_svn_revision_re = re.compile(r'Revision: (.+)') -_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') -_svn_info_xml_url_re = re.compile(r'<url>(.*)</url>') - - -class Subversion(VersionControl): - name = 'svn' - dirname = '.svn' - repo_name = 'checkout' - schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') - bundle_file = 'svn-checkout.txt' - guide = ('# This was an svn checkout; to make it a checkout again run:\n' - 'svn checkout --force -r %(rev)s %(url)s .\n') - - def get_info(self, location): - """Returns (url, revision), where both are strings""" - assert not location.rstrip('/').endswith(self.dirname), 'Bad directory: %s' % location - output = call_subprocess( - [self.cmd, 'info', location], show_stdout=False, extra_environ={'LANG': 'C'}) - match = _svn_url_re.search(output) - if not match: - logger.warn('Cannot determine URL of svn checkout %s' % display_path(location)) - logger.info('Output that cannot be parsed: \n%s' % output) - return None, None - url = match.group(1).strip() - match = _svn_revision_re.search(output) - if not match: - logger.warn('Cannot determine revision of svn checkout %s' % display_path(location)) - logger.info('Output that cannot be parsed: \n%s' % output) - return url, None - return url, match.group(1) - - def parse_vcs_bundle_file(self, content): - for line in content.splitlines(): - if not line.strip() or line.strip().startswith('#'): - continue - match = re.search(r'^-r\s*([^ ])?', line) - if not match: - return None, None - rev = match.group(1) - rest = line[match.end():].strip().split(None, 1)[0] - return rest, rev - return None, None - - def export(self, location): - """Export the svn repository at the url to the destination location""" - url, rev = self.get_url_rev() - rev_options = get_rev_options(url, rev) - logger.notify('Exporting svn repository %s to %s' % (url, location)) - logger.indent += 2 - try: - 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) - call_subprocess( - [self.cmd, 'export'] + rev_options + [url, location], - filter_stdout=self._filter, show_stdout=False) - finally: - logger.indent -= 2 - - def switch(self, dest, url, rev_options): - call_subprocess( - [self.cmd, 'switch'] + rev_options + [url, dest]) - - def update(self, dest, rev_options): - call_subprocess( - [self.cmd, 'update'] + rev_options + [dest]) - - def obtain(self, dest): - url, rev = self.get_url_rev() - rev_options = get_rev_options(url, rev) - if rev: - rev_display = ' (to revision %s)' % rev - else: - rev_display = '' - if self.check_destination(dest, url, rev_options, rev_display): - logger.notify('Checking out %s%s to %s' - % (url, rev_display, display_path(dest))) - call_subprocess( - [self.cmd, 'checkout', '-q'] + rev_options + [url, dest]) - - def get_location(self, dist, dependency_links): - for url in dependency_links: - egg_fragment = Link(url).egg_fragment - if not egg_fragment: - continue - if '-' in egg_fragment: - ## FIXME: will this work when a package has - in the name? - key = '-'.join(egg_fragment.split('-')[:-1]).lower() - else: - key = egg_fragment - if key == dist.key: - return url.split('#', 1)[0] - return None - - def get_revision(self, 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 self.dirname not in dirs: - dirs[:] = [] - continue # no sense walking uncontrolled subdirs - dirs.remove(self.dirname) - entries_fn = os.path.join(base, self.dirname, 'entries') - if not os.path.exists(entries_fn): - ## FIXME: should we warn? - continue - - dirurl, localrev = self._get_svn_url_rev(base) - - if base == location: - base_url = dirurl + '/' # save the root url - elif not dirurl or not dirurl.startswith(base_url): - dirs[:] = [] - continue # not part of the same svn tree, skip it - revision = max(revision, localrev) - return revision - - def get_url_rev(self): - # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it - url, rev = super(Subversion, self).get_url_rev() - if url.startswith('ssh://'): - url = 'svn+' + url - return url, rev - - def get_url(self, 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.warn("Could not find setup.py for directory %s (tried all parent directories)" - % orig_location) - return None - - return self._get_svn_url_rev(location)[0] - - def _get_svn_url_rev(self, location): - from pip.exceptions import InstallationError - - f = open(os.path.join(location, self.dirname, 'entries')) - data = f.read() - f.close() - 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 = call_subprocess([self.cmd, '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 - - def get_tag_revs(self, svn_tag_url): - stdout = call_subprocess( - [self.cmd, 'ls', '-v', svn_tag_url], show_stdout=False) - results = [] - for line in stdout.splitlines(): - parts = line.split() - rev = int(parts[0]) - tag = parts[-1].strip('/') - results.append((tag, rev)) - return results - - def find_tag_match(self, rev, tag_revs): - best_match_rev = None - best_tag = None - for tag, tag_rev in tag_revs: - if (tag_rev > rev and - (best_match_rev is None or best_match_rev > tag_rev)): - # FIXME: Is best_match > tag_rev really possible? - # or is it a sign something is wacky? - best_match_rev = tag_rev - best_tag = tag - return best_tag - - def get_src_requirement(self, dist, location, find_tags=False): - repo = self.get_url(location) - if repo is None: - return None - parts = repo.split('/') - ## FIXME: why not project name? - egg_project_name = dist.egg_name().split('-', 1)[0] - rev = self.get_revision(location) - if parts[-2] in ('tags', 'tag'): - # It's a tag, perfect! - full_egg_name = '%s-%s' % (egg_project_name, parts[-1]) - elif parts[-2] in ('branches', 'branch'): - # It's a branch :( - full_egg_name = '%s-%s-r%s' % (dist.egg_name(), parts[-1], rev) - elif parts[-1] == 'trunk': - # Trunk :-/ - full_egg_name = '%s-dev_r%s' % (dist.egg_name(), rev) - if find_tags: - tag_url = '/'.join(parts[:-1]) + '/tags' - tag_revs = self.get_tag_revs(tag_url) - match = self.find_tag_match(rev, tag_revs) - if match: - logger.notify('trunk checkout %s seems to be equivalent to tag %s' % match) - repo = '%s/%s' % (tag_url, match) - full_egg_name = '%s-%s' % (egg_project_name, match) - else: - # Don't know what it is - logger.warn('svn URL does not fit normal structure (tags/branches/trunk): %s' % repo) - full_egg_name = '%s-dev_r%s' % (egg_project_name, rev) - return 'svn+%s@%s#egg=%s' % (repo, rev, full_egg_name) - - -def get_rev_options(url, rev): - if rev: - rev_options = ['-r', rev] - else: - rev_options = [] - - r = urlparse.urlsplit(url) - if hasattr(r, 'username'): - # >= Python-2.5 - username, password = r.username, r.password - else: - netloc = r[1] - if '@' in netloc: - auth = netloc.split('@')[0] - if ':' in auth: - username, password = auth.split(':', 1) - else: - username, password = auth, None - else: - username, password = None, None - - if username: - rev_options += ['--username', username] - if password: - rev_options += ['--password', password] - return rev_options - - -vcs.register(Subversion) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vcs/subversion.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vcs/subversion.pyc deleted file mode 100644 index ab7ff6eb080b71b10e73f017019c7e6fd48c6fb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10698 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 J_~+WS{|0nw4_*KO diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/__init__.py deleted file mode 100644 index a996951fc..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/__init__.py +++ /dev/null @@ -1,8 +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 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/__init__.pyc deleted file mode 100644 index 60c3dc59c12f679cbc86d54b61883096532ff6a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 490 zcmY*W&1xGl5Z10s6BbJDInB|R>>-yzDaC;%rx1#B2pCbZyPCC!Y9%3!O#L8vxjsSf zeSyrzE+jg9Go$aDAB`6OJ~hvO>-C^crxv?fDU~n9u}W<OD`jitDmB$=Q>)4@)Z_Al z(D{!*6DhWP^fn}*45OH1M1BhvqcG?P!VF;q(E<mE2}Q%;5$!BHUN=WI1P?h($h(=s z-;Bw3u5Fq-a#DqSCX1(H{~PCBD9%EUFoah=p#_?z!d>qWI&a}53Emw<*OX{G7LiP| z$COFZU`%0x5;G_4rnVt@omy4`d?C>FIk>`TXo?~6!*Ve*X9C99Fc`zlt3MVl35{7x zq?Yd?|CHE%(OcqO>Gc!&8#l_VZ@iwo{*Haw>K_N*1%K=J`nvtB@2S_B7_VYC{OY!t hwQNlvSFMd9Pi#yZ4}2~yzD~gwhu`Mu^8BSAs~3?Vl6U|B diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/__init__.py deleted file mode 100644 index d6ae0f295..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2013 Vinay Sajip. -# Licensed to the Python Software Foundation under a contributor agreement. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -import logging - -__version__ = '0.1.1' - -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 - -logger = logging.getLogger(__name__) -logger.addHandler(NullHandler()) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/__init__.pyc deleted file mode 100644 index cb68abad033387572ff10e104ccdcbbdd88b11c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1338 zcmc&!QE$^Q5I!eqx)vrFOgtd*9wAXNUXUh)7_1UVQ-#upL1ZaPYB%+kIFapE^m#n; z%75gY9{_i5)lK4wmo3Vj&*$^qcjvRi-}}R#zk+lI+pmY?J0$x9nZTbx4UnM_K*m6X zAOo1A5W#nVD}b+A2<t;{+9T5@f-C}duAf6BdvG}fvjE1Jh(Q8e#C~&sw>bjM;0vwv zLGHm7gKPkD02f1$5&1_ALlDzs4*{t^_)RQ<d^tKA9l3`nohs{URgS;SWam_?ceyZJ ze2-*lD~3S)=`=wZk^q?_b)M^@k$LWhe$upJS>tqLg(~opoued<d8OQ9S@LtGPwKgm z;)YZz%}-^ytoY}(TeNztSNzrJH9u1&x5~*ET`{{XDrtGAI=+%xw1$ffbe`u*E0^b^ zZk<xldq|cr#w?*M94RKty8c*bQA?ACIR7`#r>NcJi6@80lLd5sB!rYXIh+wABDWuq zY=jKWr#{f+MtNw#%6jf%6pWm;MqHQW7AxZ8FMQ&U2olnNq>)k@DRs=<fT!@XQSLF0 z9(v*dQTbCkhm@+D_K{uV^U^I=*tgRGLh#KHvjIz};T)l=+p1E!@*SAxD`_lVF}yDW zT-#ka-?ZL~xBJv|t#M;xkdu#X*ZMt`bZ6)id)PNNWltfb@i(v#VrzVN)$s4ao6Sq` Xmf%}@W$p)Y@FWb`A=_uqq6h3RA)`U( diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/__init__.py deleted file mode 100644 index f7dbf4c9a..000000000 --- a/PythonEnv/2.7/Lib/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/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/__init__.pyc deleted file mode 100644 index 13d56fa79e6c00b7ab552ddc76198abc2d6f5fd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 489 zcmYjN!Ab-%3>_6zM*N2y_u!7`9t06l(8Gd?=s}P|X{VjtXty1jbY(xpfAsDTm~})g zBz;Mf^u26-?$_@hn-6XEb2j9@5Tjb0tEy-58`a}zbDi6h*W2Vu@C0q@(L3mJTEP8^ z=PAMjh)r}RI|yjA$>`|-x|9JU`y5SxLLO2KtER4}(cuzZk!%|bk<654=t^uEQ<Nxs zX)cn(2=2Ji*0isE%G@lF+6G`MQ={{)E@WmNkbo1I@Mcy7xL8*L&oRyjq=5tsY$wgp z0C;W~7T<bKrP9~7VBj&vLt-ZiAlVn+GQk^$0M@VB3z=?U)zo*R^|p9NoYpS2T8{)) ze~x+y-Km-(&x=)07%xMYz59nOMs?+FnW<rk*Kw(in-g_|RuQrv_aa)<k?OHmOVOLM fa!4%v)bB==))<ksZu%AP%BN?8tn+QbBvyR^nr@mz diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/misc.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/misc.py deleted file mode 100644 index cfb318d34..000000000 --- a/PythonEnv/2.7/Lib/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/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/misc.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/misc.pyc deleted file mode 100644 index c30ba03398bb842dd67ca82a84dc2638b69781ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1580 zcmc&!;c65y5T5MbU9Z<WtF|gsghdbz(F%eHB4VxmA;=+Dp|UKjyGibvb2nKwx#B|o zWBUr?^Z3VS@xKqCGuhJi33Op5lgT$p=9|fezej^_zk(@;v#*QeOBDMPl>mrQGY|n3 z3}Q4|JAgO<5rXJ|=)ydNID}@?ulAtmK-q=33+zDOfsX9KrvcO-fiWgmK&-$iZq)_N z;6pP2*@w6f2l_rDS3UAOA?ct#6ay&NAYKC|R^b$H({IB@AQ>!%5DzhO3nNE9@`sNc zc;wI{@#6dAHOl7^s#h8RRGHe@XlCk2X`zmkSY}1Ui_BVSqfCovw$$7yqwTi(gWtqm z!$_X-Lz&KMQ>NA|Yc5^idy68=i*_=zQgb8ZnBmG41$cleMCqXHqS!4|#|-KrQB|!I zuU`T<MrQ!G_Q!;sIEv?9n=zW;-EIY~s!3-GkE0?9nJ?##BIIY+;?M?L(Au+PuH4}= zPY#scDQ2}4m#kdr<TXVn?;3Y#^qxLS9&bNQ-l{yY%E^Zn(v;1mO)6C-M^Xz@Cqh|Q zARx`pI7~`q`F7R#Oo<{(SpvJxJOQ4c-K^z@Q%WRsT~EXa4Tou?W^h79qUFh$7;^(u z$|`MLrn#IF)9s!VZt}(d%$BZs8^zL1ft_b|USi_oa%S}gWx0Rm3Mkq73Aq*_xDG73 zZ~}0`5YeNiz&hg^&KG^SiNjZX2N>>&nOHhmey${UQQkOgSZrhK>IacFF1lyOtGGTT z<y*u<e2X9kx5rrDp{=X2?gqN%(os)YoXXO#D?N9#$NQ#|dv%TPg_3hP^F>Wlos}|8 zFUm~u<olm>p>o_su|rhA)>#K-Bj~a56`cFmlcvJ(G<5_uc6!N=ZHj*CE>%{(p&k7* z-jwvSXel5<a07ZaX*#7Y@ElDr?G``*+!O`YhJGHtYo~OSql0#wt5v>qE%<^cZ~gN( p>+ATuG-6rE7t|LvLe&d~Y#6MEA=_jlcC{O_0gb_^6XG~xe*u>{dY1qI diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/shutil.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/shutil.py deleted file mode 100644 index 9e2e234d4..000000000 --- a/PythonEnv/2.7/Lib/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 registery operation with the archiving - and unpacking registeries 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 registery.""" - 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/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/shutil.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/shutil.pyc deleted file mode 100644 index be53f70b53a55526be4518368cf3dc212705e2fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28060 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 Iz;?U;HwC+^8~^|S diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/sysconfig.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/sysconfig.py deleted file mode 100644 index 34e2ef197..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/sysconfig.py +++ /dev/null @@ -1,787 +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 distlib.resources import finder - _finder = finder('distlib._backport') - _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("([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('-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('-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('-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('-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('-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/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/sysconfig.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/sysconfig.pyc deleted file mode 100644 index 8c4b1138e1f31547d2c2a62d1f7031fb18ec4c0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22090 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 N_!xQLR=ZGa|4*@#2}u9| diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/tarfile.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/tarfile.py deleted file mode 100644 index 0580fb795..000000000 --- a/PythonEnv/2.7/Lib/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 unreadble 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/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/tarfile.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/_backport/tarfile.pyc deleted file mode 100644 index fbd0d293cb43f3025f7b5db009c7d9c8828412cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85592 zcmd443w&JHecyQo06~HT-xMDbB@HQ31SJw8skbcIl=zToQ6POmnKDdeG?*EHLjp6v z%zzJ7ifKzp<2Z5JZqhc7cAISbN&2ai)ZHfCr0&!0Cr#ZpeQbBzG<DMS-KK52$);(W z#QXjI&b>1iASKK8XFq_%xj6USbI(1G|M|bq|MdUH`nBKp@A{HTNdH^U-{YYW+8-PY zp~}BPm<eIF5GD$tQ0)s7eWBVPCi+8lAWRH|>Z&lYDpUu<#9*kd4il^W&YCc@CQPi! z(nDclC`+#m6Kk{dx-hXWOAm*M;VivAOsvn+8^XkfEWI&IYz#MdXSbWe#HK90IZSL0 z7aRA4f!daEb!}+<-B2hLYFonqWq8ymgjZ|ZLhY_FMIW|@o0~&zd#LRQQ-$y(_ZJ(R zd3C2>{XM;^7pk<H#?r>&Fim%Nh1!~M<?c{jA9htYgsUO69xZ5$=<hvYVs~hCyRcig zwcX*$y<y_MP^IPfhbk>8hFURHH-~K#dqQ<fnAjVtTf@Wyp}H+h?DKVhsNNMO9t_p( zVd8+_90}DOVd7w@?hF$Th3c*_@o=c#9VQNiDqlSus(frTRQb{)p?Y7KI1;M&hl!)1 zS_~7%LUm7=cr;Y^hKa{Q^?@+)xSBulM5yiy6HkWf{xI=Ws681bo({DGp*9j~2Se?l zP&*uIqoMXls68BNheGX0s2vTpV_}MUdL}E$Q*s!X59A5}9M6U-?WggyoMzKz8cb^s zhbh3~xlsFHRv=~$gtvjO4~6<*s2va0(eQ-+JQDvL<j?b}#D5-+e@4O+6EB47kuY&0 zRF8&<lc9PnOq>eUN5jPFP<<>+ycnvFhlvk|>Jwq&OsLYqk9Y!J3e~5=#Mw}NI!wGA zs?UUpu~7X$m^c@z&xVQfq552y_-LqpFia#KoN*7-g-{y`S6&I#4~6P+fzZ{#&^p*( zeLhTlOtUVyxES6Jx~;wt-XZa7sGe}*<Dq)ei3wF+dpcB4g?9kLPlW1e=U)oIY4yeM z4ukMosL`Vj>k~CPb;b$$^${oN+DlH*yR%Nv!IzboV(949nA3$&qig4~^jN5!2`^O7 z`vu0L=mg!~;}ZR$M(4Y4G6dZ>KN@Nu>AuPM#WxwA?wbr!_f3YX`z8bS5^sLgpJL1t zCoc5foB|PiOQ?=}1WH<Awb!*6s~42RNPc{x9ICH`TG_cD>*h{|>cuSg)oyMjR6m~O zPIPmtq56p|_fj{v7OD($toK{Gxl^H93bm=AHoV@=oetG<mOI(ay&S5QEVtUtt%qtY z%bn`xUJ2FdEcbFZ_iCutLv6-iyVA{_4b`hz?o2ng5vsFUZljyq4Ao|qJJ-#f3)T57 zx7E#^57l;-+v(=Egx%6MEOc|*0koIqUhC#|LiKu<d!w7X5UMwIGjT1{KtGh|7~|b5 zlsG=}2DGI9RsI_(km_vUGS{j%I;E+FMx|44Hri{++LzR>)!W?dYp>$=$mr9fN7@gP zI$LhFi!Uy;JC_!Y9H~7vS(_=2%#e3{n!Iw2`_XFcVEb{^akAX0JySe(<ml1EM~)pn z_IUB=lg~VM?3p7+iw_?;cH~HL<aDcks7U_l+N6seEbeQ6NN=90K2z+JTT}I!+UVTP z;!{sO{?rqTDtbItG*O%_w<?FrjcThlI#ZjSTxd;G$5YgyHkPk7i(~cLZ0%;Pbx5h1 zC2c=cOzM@(<yN(Lp?SU0t~IKoW1ZE!eWBbs&BwF!nZ{JJqj9OXOKH10YhtletyZ&D zCmrhjTsj)nP!D}vwvlS9n3~cm7K7jMO*nF-URA*#<l=XZ_<GdWW4=D>>tnt??&}l2 zKI!XOUtjWd+}9hvPW$?5UG1pTiqIM0GFR?g_Sa|XjjO&<ZoB?Qt)uy!?bK&$9kqX< zUiIH;{_4p>qs$Yfrn{-KODhk6nXT2spHPo)>GHZR$8{;{vPl<4pdR>K9S$bcDHiIK z2=$^aln8Z=QC$t{sKJen|5R!Qy@k%y;ioEknEg(O6FNl3n;~4`+85sJ4{!H{x1954 zAr$#B3Ot5{?WD48JH`#|28<KU#<g0jQ!E$T9RPp2*lCh(EX>Rt?$lbd^#)K|El%F- z)Y`@7<ds^bGrG3Oe<K>64h&eRH7d<&9IlyK!^1W9%GnWjK*Qd4DIQIygYFmjRD4?i z(;lH*@TJ`(Rek2tbiH$VVe-<&dgJ+-saCC;OHI}rmrm9u7p5<rzuCFmY@BLbyL4>y z$xCPJlb71{PVMkqxpK8UU29*OtIu7!1{gP6m#X!4XNCf$NgmEMTb)b273DU!JB^=F zYt`=1zok%72X&*r9%QYfILL6EjOAPX8fqBMtNo!hqDR~o8TUpk$C&f4Pm?k3;aW1_ z?={GA8se110Z#;B5mj~Jc&gs0dK9ZQ&4I@}*+;oV$SFC%#qdA30>-z|Y5x`4V+;`b zHx`Bq>kAdZhsIZM<T3s;Bp65rcvpu%3|_&*`z_(-e)R?L)nkSoj;ue-!9uPQZ!dr^ zgp2b(8U~n6an}=Kky-7q{M7O3Lg3k}4R{MCt`Ke<4=iKGj@oz(E!fGQldp}0xA+1X zgW)BLY3Z!?%py~)2|IRC=t=VDe_y!Bv+<E3+S`6at?#a*#=`7mtyP=?zgFWk&KXQu zRC*9+Gor{_yl8AvZddAc&!ncj(n*AMjR@KzN%h9H@=U#2yj&|+Yb_(Q5n%}fZsl^z zf1z55@PIM%$I3GcH6!EB7V^%-3O?-jW46GlRc=hzlD%0?%~sWLY7jEuG<>bE2=J-@ z9PMn2iiB0$3;l)t0MORH!NR?TwT0brxvEbZIfK&gkzlf!;DP?Dh0sL0iBsDjc5X#5 zYV?J^LJRJ6z!Od`Md4GogGB)<W}43LV39ZeoK`WA$2xCcHv9oMz=$ha6<XId5nVWo ztDi4R`1&ysoGXCn8Yc$Dxd`Np6$IrGT>xZn2O*RjPlzn0l^Y`Wg|}#6f4DM~_6CmV zIPVvzh7O&jg89D=G-f4`1^u)i=p1GUmO$qsSj>=p4`B1qDF`#H87J;P@=!B5tSk|( z_D)hwD96-H^Lnw~NP#;-eX@~<hMbxDSM|m%E+b+Xl0CXSz{ODd;@B&t)8~?xpTCeC zRi4lQ3t*wradM#{OrBC~5?XAcMCDeid^348d!r7k(&~(8@)L1dez#hOf<)3Y)ojg{ zI}tBF!SfXW&Gk;>pU@JIVi?+2*w<GqZ0sBE-`_V>*iqP4*ihKiLynpUL-Y+2zzm3y z!My@T%8+4^8Beo-6@xDbY!A6RfT0~AtVORGqXE6S*MPa(U-NPS^jQ=sru#9b{zQ4E zvM>W%Q0!c;6)Tr(m8<QA*&?G{EEi|tI%};1?G#nPI23sZ8!=s6m@AfNX3RXmKZwsP zS70&P#oCQZZLZ@AVvVsr<In4t;Yf@1cCpi{nG-3ui}k6jl6t3joeUV`8JLvounfgE zAX96P7N4(FKxZjKqiTUQG10|#bD>3vLs=c|<}5uCA3rj_&?v$@7sqO^UN~5+bo*Jk z>=woP>(dRsrRI05h>g5XD~gk~VzoXsRcpZs(NGOht5z)Y(;KwC;Zd7hP#L#4Ylqr+ zxjuclI7zSCwa#d9yji@?d);Pqt~a~G-9A)YXtZNnXmVCb%*hrpljX&8^s%R2sDCfO z<GV*6f8vGu4{>L<JS#AnJ)4Z2ov1Q1mpsGY<O5uK*)+bR6`nPq6vw9{y<BWSnzPIc zP1sMPm$s(;8)~0WOc;8y@MNSIT3hO>*Vh&X3~(3f?hCC=T3_S32lKB9t?_W<h*nu^ zOlw8U54I!Y0^1)9=Y{xLm*xt2P?*0zTvQcM22eQTOI>fmw)BNda4W0ATZ7@oM@9eN zG_^VT+KKR%mnL<qoa+Xef!axvBZBe;F(i>Z!PDIKN%18RnaDJ45RFh}Swnl34Z5=5 zd(X<KT+KJ9(S|6(;~;%TMn07Yrdmx_KB6I_L9yMch@fP*)pjZ>u-eZ|W$&?+$C{1W zp<+dq3FuiVb*+zPqeC)-T|PG!#UU}_?XBFy$QPSauD=L20P~=rI4(Hm68RzV>#E+s ze4(`v6BLf(+w~UWK}sI3%{Hs1A(8(P+i>QbS)(3nMUTu{(UoLB1(FxJF#aLD@XG1& zGZUv=*W^qS6lm(ys?C<+$stF8QkY!k1+b1bXqeL(G2Ir27zTz512Eu2g^h(lQkx3{ z@KJXawsOCP-{!vIG_|RaNa}HK4ksVWl2vC^l83X5*x&0t#<AlP7b+SC5oS${*O(aJ zX;>Xt@NrSHldrubmixvFS{)}}JM6X5Z=Q$c)E|!X(`vliYs<?(YwP^{-GP5%!mpUR zDRX|k7n~s80$M6{RrKvHd#=HNJ~8{CeaX71+zVt08pSMR*z|Dg`i=N6LM4FwO54(K z@j}#yjLsldjvVw0$*X*a9%ZO<11Wt>UqVeXiT*^$r#v?YAR9ohH0uqsExuDZC+3j5 zEfvI<gr1-Yek3BY%s?fKnRV+arnfDfMOZZ`ZXB*<ePK=C=7NUY|7reTkcL8|Q9}*K zWO3~aNveYoA$g(P1`U`CK*u&3DUH5UDoM*yDw$a<l^CIg8Qp3HmP*xTrBv#ThEvO- zK1c-IFKQ^17-UIxM0!r$=!nBHN_qd|AvE)1tx;>0XL>_o-l!JqE7q(riKCQgIVHl) z3B)1C*)HE;%+QXHEE){4?FlIO8yJaG8Bllx78=6jEF?2>s5&p#ufgj@nRVrj#4P=O zdC^E{shnue&b4Z7X_LRs0U71(r2|sFR<6$ow?IF;^}>at7ptz^k%6-a=NFBPNY%J_ z{MoN_P@cQPptKj}q~QZoH^HUoXHnx9n+;)lK5%%Zezle%@Rd78O^wKHW0ce2ynmds zhpHCiSTCojO<L*rWRAvvY|%Jq6`h)$>)iZ?24lD0UW8U^sw)*(S1vrv)9#Ni8i#G< zz~eS55{$p0u_)d)7ARk0eJg%ETD1MrqVW)maq8UZZ)hZ>16=|YIcX!Vl$8q`ZCYQ- zk418focE6)?z^q`i#5(Gx995TWWMK}yT}<|m~7YP7Z4}EAz+YZaWOE=)*;yFu%sQz zh6a8NMjj%w(xF2#No~;>NmElg+q{0ZcC9vZ8X4twP|?8V`E^tZ@4&d*-lYVFm44@- z+a7RYP&~b4z4m9gQ2XH-RUhT`)O1)JkEFRR0p8j<ji|(OMz<?uok4ZhE-pyaLbr>) z*K&WEccxK1%CrK%6Kgafi*%hDGQq7}LBrRM_1TWsPm9EyTLeY?lr5NHiK62ZO2zyB z@Pcjz@C)e+Pau)*LN=A52vrDL8065GYzv^wU^vG!I2pZw+6K`Sm5{AcXkAKcB<IBO z7)w6E7n4g|Y;-<Xdg092^U25SKh31rf@BMCvz<OoPM#Y(`|<SVV&WS~Jm*R$l2gxL zu=I1TbRl_V?1a;o%k6Tf(@L)C1L`GQPs3GCMSG4j+qIb~CnQqYnXV@~Er-<P{*_Ag zM!i!iwFI8R-vPtU+QQDlY7`Ku3Y<ssABc0ejf4i=b{!^7V!sDkrN*Kpa9w2th?SXU zyOw+_Dcie~Pb$T4`7F)Jr}_HtQ)ktqP^jpSegaSfrxacJ4oZ_DCESw!B`;Ghc1^Fl zYsn5$%iKRT>s#Nee`@3H{k!8FCS&TEr?1z?eaqiRHS1HoK8|Q@E)m3&Pbu%yx_F}W zN^fSIT8=fBEYOY_HC@KI!GXcPp`oGvq5h~)iSk#M6llz?y17N->m>zfsNaD~psF5p z0(7|A39OiFoLDPUD7MUZa4B3D@Kwcdsq}g|+UZ?#);qCLghhIy_8+C`CuYiR%t4pS zvXZor|BG0F${22{<vGkrSYSHWYqdru;E7~+$-*KDFe6FD3#k3_qG3u|nvI#8*_(}8 zt;$E6#mnVuwW26dxjJ&Nh{?+;Ws*_kjtm0rF#)P|zibup^?JKDY89f?*wb&+=TyNY ze~&Ga-l2VSP52F@`YuU){!T5dG#79&z~m&`TkS@9c5Vg_v-ZvQXuAV(?b@f(oaRF3 z5N&Uxt*$xMDbHc9!nLh}`mIwLU7K~c6hT2$7_WlJ<<NP)WTLE*@q<<ai{8zY&Putt zhM)c#mHj<ti={4VXuU0<AUg_16ig&0mteNkGU74~YkXzAfY4sFWh9zGFr8pU$BJPa zxr!CS-0P|Rvjp))<7=9WvRDah?6!lJ*2=b`93U)~85SW|&U#y9NNfl<e@mL?Dh3w5 zyT5P~%a5H(W;V)3bFpzRP9>Y{RPrzFRI)i|?8gTi^NK3mC_BrQE&32tNjY2160C8x zJ8g^ErY;ob_xt89-=v)$a;YE4eSEvDLHUorjzdeK!^hX^1G4_;<1iiZ3*RB%cYSt8 zcyo2QvQxF|c2}7Hfr4`G?&a{&i;Y9-3?(3@?VojGZMbqz)~IymHUzMkJ<SK9LQ>PT zg@Vzivt%&T15g>XqzftoqM}Uz4<#jvOF0+a*#LXFTaLANlk)~1S<=L#)fKEYnpBr5 zw9GWw`ZD>(vGzTb=I^@|9#L({S$#xJEWw+LNu))|OL`)_XO`e}c?R36)U#=;&$pU4 zZu+HZmH;}m&ds@6a!W5&^pYSt%Ql)!>vbASsGJ6)S*V|qtXnJj&3Qy6zxwF<&&*0G zW%X9V_@^vNtMceE_p*Ym$$YsvA|aU4^c!|ajXaVO4Oz*z>)in^)yxq4!o;zYIDkd{ zAKy?*D)dCv@$5wRi7ArJTajV7MFDp+`K(gkrOS8g@&|O$hk8V7S?HC>==X?TohK3c zhcH^<IfkPIfBQCKz{>sK*U!^_n;<rkzeOHqed{r0WqC4qZRwNi&=94DqJssM_n5DT zxQTEN5)!xnpjHs;V>nH*v{}E*URBJ!DCAi3JzOK>N!j4rIL@ki1@N4axR<K6nNsOX z8cV@WDC~;;S0B0<`_FQt4!h3`L7FyNQD%Qwmu4aUF%}WG+K&zqsM@dPf*llBC58zc zCHx+1f!c$S@kIf%$|uF>W?i@fI<|4T^<DlLXnJ)h@(mES5F_6Ng>$7Si~(E(RU?sY zh?Rf|Q=BBfo->FNb^PSshy*c}Dx+J7scp7IWMt}Msk+P)#!u$SpFQjGx&O0k*7&~f zt8Fc(Q7ZUd@Rk{;db@cTC+w#WANAO_YI8F<os5}B@zU{n&%Oo{G8Q>`>h#&?FPu7Q zL-EVczgoKZ!kG)>UZgxKy?pBB(%DlVJ9ResqkJ#=T|BGQ5iVZu_A}nVU5dI&CF2Am zD}Mn(-IkL|&&$dnY8doaRRhk~v&-xcntUIf_&I^%780TVE<`>p?fbAnZ^5UpBB0by zkZM*!BAvj1g%`Pl!@ji_lvoMFCV)Yrgu|W-4<N>a^LY%sJ=s?>N1z&_!|s&df?`{C zrwEXmf}9=j1f)RpxSeY4?0-?-1LDJ^2{Jb*gK^{>d+?Ne8*McT#;It`;(f%f#;JdZ zhspn<%jb02tBdBlOJ`&nN`9D}-qa=gbjvSZmIV=y@%4YK858N0`>y6{BfsukX_a`c zMDLl00fw5fXW&D)aYil#aRM1vC76T(Iq52m>tZ%J@ljEOAB)F~`}spX^II_R%k5Uc z(SD7~d(Dabugb;imz!`GjoS61negtq$CwYxAv%j2ig{bDCYascRE|ZT!Wa2YoGH^r zQ%Q}-ikhJm%Nry7vL;H5OBmQ#xTkP;kJ3q0^(6gI5^;cA;8liHH`wNx7RcV|bc%p~ z`L_FZK#olmvO6p2or%p>TJObwoX%$}CgSSy40}06raaaI-@3{l%N1o6$jx=owLmgf zhvO{j3>aM7q9P_2S&{jFoUPyC(EiV^f;ZNS6p3O(Ga?WffHXR7spU>cM`X{BC2TBi zN<H&ov3)s}wes*&#nVW3MI83ZQ^=mz**cSI9f7Xmm{oqspX4iMf{htcA~U1q^3_j% z^^^S}k_~YYIabUtXT%^y*3`^G`*LK@1b8{(&_gA^Uk^U5%ULcfO5yeI1dn&qsxUBw ztI>Uhd-`_bEQ0&d>IVu3ae3X;SD}c}y}D}%ZIcrr6!1zDePJEIplL*0i;0Lh5Z4SR zDZqkmaDub!m^#S;gOstKoy1Upde**g+2#NNh<#wY#rROlyYS+g2!t$<p>Q1FzP&80 z$nBZic4#*N-$o#faLji=il{n{x9%$3cvNoCt<6StS@YtqlHvB+0x~I#gx2G)hV%2k z8u)iHeSetuU&-G8=pEnxNbdc;_)G0A@GpD6kN2C|Yu%QiZy6uizy!4A^|^$d>MHD` z<|5;6(9x$7Q4eoMk<U0<m-|24miETdU3^(@M9*?f`<k}wPk57d&GuR4Flwn{g?+bh zY2pXszA3F=y9bWh$vtvil6SNdCKZGb{{A>Qk)Qg*q@sKkbsOlMLH)_B3NWZ4c}$m= zb<z5<k9yos^GR;ae@)Glr=7Tg59CT9%HK=N1{mS?D2dR&yD$VRC8E5s?=EDYwS_~- zIby9gvf9=yN_o9$@b&Y06KROcEcMKKl#Ha-S!hL<<;dsYIj6}(K_$gdONuI(?mRyo zG0*3Cd8Oc>$UN6(W**R32_i$k8GiFFLO4Rk9s~wJ>obnSPEgEMws+LcymWK*kR=nn zcoA^ew6V`BEw7`Kuc5bzNGV?9>YD!$zKXm^9(E+S8+K&FoJOn#j*4GQ9Tw$CI9}_R zD&2Y5VOSXXQ9RYBac@B-*{;>D<_usWKX5nb1t;s(YM!Twl1`B?q^}gUA<mSmtAd$f zPe-jfq9qsE)N@Li`7uy<l{CqV{E-$&EO$YvS9Fm)w!AE>XI*_1n-*<L16vFCvl6yJ zZ-yh|Dukk+C;!tVgq)+h_k`V4@k|9t<MjQarzm1`&tSyU?I)w(cVBL5=kGF?3MGk1 zpOOufg9aPw7hy3AG=N4Ewk-k#>=bN|<P8C1Tj(mc_!=m*ic&RY`)p7k$32<$z`m0l z0tB3yitnVVwQ7z1g0<=)m|m}Hbhl|GsqbrqwLFKzo((_^r-~)WeJm=GtXmVhv~De8 zRD(%b&7agoh``Kq51HCdm56({;%s@r#3=u9fyj0m6jlx6zA5EV^o!ntk|~vO1SVbP z<nMD6m#lCE6neLBS;wB=@wiP9j#-lp41LNfYKr2){}WkJqk|M0*je^5L(<Lde!NQR z?g$wGOVk3dwhH>QRzaf)F=ENIz<{y%^Zv+|19xhHKmR1(pC66bhZ2QQjL@gzg<!$T zFQ$O^Fg;5F&+zs&pv>HDTSmRiEg~boFb36fr<@aj|Fo*!tBaxAfMOPREqOh<ot#&Z zSuRUKW<n3d880))`~*#SQ6N(!Az^quU?SIf0Zo5lJ5JD>xZmc#CNct^E|K{ZH&M$7 zXPW{DdrFwF2p}ax02qaNSpp-^MQo$l2G%^={I%~wZnlw<^`fCMn{D5Cw*6vC<J&al zU1mEXgHa(7lX^@&#dO;e_{2VQT?3QIjo2y7UrlfkMlEfLD84Ihigd%EU_r+swW*4L zVuen-75kBGyrjwBMpGqV3qxq)vk4y?*`!ewq3wBQM}zPWC{N0-Xxjc^r9Q2TIJxBW zy8O5<#;YC=fm))4(*t>@mPHBlHtl!^hS9Rz;1Jg1$A$)mHVm!BioAR1{-IUF>xZ`t z-IaWXaut65kMhxs{LOe22~NjnMX=^%uPIh~M&MdQ?$6pFSZ=WS&l~SD90X&UQ8V^d z5W7GEg^Z;lnB(>aj=(*I{<b)x9T>#}tv4S!a4^z4uU+Q4=YJxYWtp<PP)9`yz&Zoj zvW}IBTq?_eIz1NQxC`6Xz`k(y+=-X8b1335)g4VSD%P9hWtrYj(S&(glo|*ykYrug zU$aP}k=<UazwR~caMooZxu~cx_!?RFI=Mm|R2F)j+}P8Nbvt<^-%02@Q`_1udTS+_ z5i5EI<sOofVH~x>xS8cKn+h-;L>;iWg%>6+KYi4eG*il`GSsMeON#=bbgZ&pDY8=X zowV(y#z#asK+^{Ns|cdApFv?W8C_5SGvr-(JmUuZPg82e^i7SqrM{_sq44gGJBD42 zgt2pPSuP*y6-u2^(={!F{h;0f{$FjJQo_b-Gj<o}s(*If87EQ0mj<bZD=Jq)T7jba z!#mt!!;7AqRy`>PrCD^>!I&4_b>K6jyAEpEA-}a&-Z<;1x4j8?_!>xAKC*HW$-8W3 z7&%q<7$5I#J%e?Buia<%UXN*EV?^8wmti;f$5yHZd7EUfquFn^u9jQP1w2TF)62z~ z`fR=9?H*ut9BVRn0hAUD(P{J+*~^iB#C_W%3k~lGk%@5hMJ_6M5KkXDB(Qtkdr9<# z?B#O4H|*`6UYPA|Tovtie4pF>PM_jYk9Js;1b?QYf-PH2(%WYGQezeR%4}h2O2?90 zT%%m>)ujoy;ve4yyMUT;P$5gd@+63sX^ZIHS9$=wY;@*xg5@<dG$3sa;qYk$qfY8) z1T#qj?8}(Uc)utJI8Sk;>P7H6ry-S~Wo*<PH>9U1AQgady|&siI7LzAW<{ww_0Y9X zia53qeRU!3(K9!qZVRy*?BtJdF(U|c$-Bg3YM#xE?Dy+E^&k@U72rYf(=_ILX;JE3 z8#n#Rw{|$1S*7F|;O8O#F%nB9lh<>S$-FWCdrKy$J$j<6$KJBafFx76g($07HE+pu zv8-Z;f+)CTvWjG#)ozuw_tb*QL=;!lDAhykC25AL$9fnu#+}*n(D@50@sqk}F5?pN zq7X}x$P8_hZL56UD@T&+N{}=~i2k@{ZzqX>h>-~!+NQm&Pjcp+Ot6npIAWSB!8(Ub zJpt&;7ACrFaWfKdg+9uY?|xp7iW@<XH6%Hp_5hL}+0|viAX;!gu3-`MYFN@xQi~Xr z)jW#*%V0&1<NQ0N`Cn#K_<5S}=hP8?bi@p|M!&lvKfn#0kTG2rbTgwYfouw+5{Kza z?Myb#vc{H7Xit;7m-^yj_)|(5eT|XIk%^zx1BF6c=CM(;eyTUgat*niNIXuVILWCZ z?x=6=7y_`T7QE<S;K5tsymd+a6r&z(uSOF;s@vYkXlf!lUjc*iX&Uphy+IK|h~Y29 zkuB9Z{2$8ulrG(M9Q6wVyQqRteZ6^hYFSqFpQjz~s9!?GgM)*8aJYjg7B&v8!a;qN z9jZ!V%+54)tx(GU@k-=$pC_@1({&USv=w4=`^>q*=0?WXw&8c+ckP~z_@-iO#McUE zw1pR*M@0Y+dA+4@4e*wc&BV>Tc7uoyasZm58QCTzd823CAqt9XbvV~zxrjERBUf(% zQCSz7da4s3q)rjISyz(1n0KG82qe`Qtz47l4WO*snMag<Kz|9wK2ty7_zYVkKkFBq z*{|qL(;$cec}JwhR>`)Z7d=RXqR|qf3;}7{a-BZ;+EvHluyqS`0=<>D&JVj>=7u59 zYCep2f~k2%SK?zEy!B>(*nwMgT11}GC@uL;`iM`@UqM?LTY%vO{WykiT9f~Zsnwzn zag(}VnrVx%#k6G2n>DAVaPqa80h_$Na&4rvUd@cbY<Ui^+A89Suq}5<nZL<*=yH}z z6b;QF7!iC?55y|;*owM>plXUxMRnx&t29c`8PdHKwJeKCOaAAznD&u~3^q(QHm@ys z&<@$au@!f_`wK;E!W%###;X8WPe=U#H(gE;sCm0j1`=eI)KMsM-02*6kY#F<CN65d zn8Fl?YB-ZGaal2H05#@UG(3@e*wQ!98vqT0*PCWjaF}WH+7FSDv&dBzT2?h04ZNEb z{4ep&is|;}Y0SS-xA`&Cw=4J7lifuz%z5f&Ctx0Da$~fdtgDi+rA1Z$d&a@B*jx8o zpNVwSx7;l=$M_$YbY7@ofS>34C1#$^BP|Md-k)MbK|o*FDc8_l*|rt3jBNFQWx+GX zN=ClHf+~oPji(DY-jopD`m$?^_-!!kx-=l;FUUB?|BBmGs40f1#0eTqn}w$QKD>U; z>vb85Azjf#%;%%on1m%FNx?)!kJ9mA;1&K|1hHu@GsNna+Sc6KZTxCaySQ^jqQF4d z8Qrp74MMW~uI(HpDXoF;9D>_AWo=W2s$LzQitN>ZDp;-NVQG9GY%X=M2v~a$mqd0U z$x}UZ&|;X0-a?d&!6s9O9&0izoC$g&nyxpZZ_Zy)wSQTcy}B4fTLzc76g_t|w-NYU z$BViZV{1dT)vnP$pwpa7zNm-$xhyl<R_lLVFzR-&#bImTF5+@&o5OC9^#Df3od|r} zLE!fkcJ*xld2cPG9>yYrIct+g?^DVXvddYP^o?FOomv(W^%rT!m(<r`655D3yaRr3 z6`Y<jPTe>SS~=%%(-rRhAEhI!Ctc_wRuAqCrDkOEV1FW$2e+5)OBaV1xjpt2qTr-F z@#8u2!!D*$aFT;BX;g5sC4pUulwTie8^V>1*~Ub6g~g4D?7)f}6Ss6XCYEWEnjB-x zL{831Nm)h3Eoy^ej8~L~$n4_GGjc+fKL!SKqGe`*#b8YoJxWVuB(+8@Rx4_O8FN)h zh*Tr<uqsi`uo|O^hAXUD)PKcCMh7K^hFi0L@;@Pg>tm+XkqOI4fL(M9rJgcOB7*~b zDDGvCnz9o2)&wV-O)o?9>5=^^S%+etNpx1GIW}Y8Qb|o|<h8y>DKBu9iRR^=C~B4p z6Nv^PON;I50r0ZGuGZDIe!8@cgxD*E{8B(`F;~O5vv%330?$218an1^ks{(Oc`JoE zFb5}C6$iIRebZ_S@3SZ0vC?`XFL?E2-+T3BJ*@`1;qX{DZ}%ogJ&!cyODm{fM&t)_ z{ZTWy?fE3BwXr{~ol+LD#!&-B|7TWosv&||xNJrT^*M~rhy9A5rmG$rP5}nRRKD1K z4g6x2tYcnq18z_S-zm(Y;@y1#;ungGaw&~mMmgFeU86Y&u{G#*v;3&n73ZL}($=nj za}I3to<+Edj%-Vuk%SlQpkhxYY(#jUWYV-;QWR$m%Zzqe$C#sna0MZb{Kx`<M`z^R zmTm-5K+!H*E_#FNnMcm$HUZ!~5I1(3>own!Dxi(W6v8_B+q#(ink_L$vR8R#f;C}F z*pg*NW@_L=0;}C5<e$G0mP4Ddgvu0PeYmi_uZTafO(Yf?G(q|qv#kfmy&Kd;C_+>O zw3v1vW{1EDr9s?k{WBqDl7GroM8g4~WWF==k>mxlzWzJhe#6uW*yD7g=TbO*_b>cJ z=9KRS2r>ygH~(DVU*-xA!_97h|67tha4I16YM@|jJ~^2WmD`>!0v-;)Bg^N%U!4Pf z;h5#WX=?Xp86U&1wuk_Oig3$eBgjjNnA;Vc@-CVwwB`X=!EqYR#^FZl=G$}K%(kI9 zCUv$(@@go-zm~<JVzhG3mTzkRK72@>^EwnMfW2&L(boa-+L960+Hv0;Ks=3Now~YY z0UT7G2wX&@UIo@hdMW%3J@9%E80FT(=X5JxeR&r}ml|q(PHA!MqfKFz7RPo|c)8hc zg%cm{+frC3#Y$$1(Fkdg3p;y#JVRnS#=AW%7NGUG;mQ;zE{690Zs=$O7{FARA3}_h z1g`qpa!5&44>EFt4db+f$YQ`@ahPgrZu3#(qC5q^px4V>a-5Zb6zsS#6XVM2<z*i8 zA-AYpbw4IG=o`oh{Sg}t28AiEXgKui4)6Wkyf^wuwHRNY`sQmQ|2ULAs5dmLWrpVE z9ZHLP+F%wHT<H8Z_TBD{P@uK%I&$_O2CYiB@L}mO;znBGabOe_&8BT9WLN)wVNFzn zXbn{UkDI-Sy4+9tMWb}Uc}MqsUYq|Hs#kR(g79o<ttYZtV`L2WT(QqQz5vgVe<5G1 zwpEzYu!>-PAT-n~%*=PZ-8_C!Ypm<GWqJGkYPh~8WEeBH<pz=-y3+L!Nf`$5ojH7Y zom(TE@l&T>Dvh7IkO)0Sg-7{D^p&@Sw1#Y#Iq^!;d*RgB$;fk<-S~0J^j5iToz{q7 zzs#Xa%e=yEdQ!jQRzQR0#=;&;PP_Z==kG}0BI&8S$Teb;aG6P_w5yoZ+V5@O6f?N! zgep<Mv1qq88q{K4De{*6%08p9P$xsb5u1`iAr-DZ(d)*3Q;Y+K-bgXvP<VKMMln8C zm}hrDZ%7{D^%vPWBr=cZRk;J}t5aIK90#sYO9(}Nh(sxJmi~XBTYmAf9J03IoFH-Z zrBwQy#%rzG1MFy@#sJ!{t=zu5-ShA2>EF}kOS+gZf0>lkfRYA|ChBwY4|VyxE?SPs zKhi~ODSBuB6H>i#aB4XQBl$Vnu|b2dn*>gP1&pNY6~Ak!e|Q%vw0kj_uGx6k(5ed0 z{hu@xb_D$U0M;U%*@vt%yGv)dzJvA)wb>3Uz0eKqbb`}5SBKiFP&2C6Nx8e6k5=ez zCpegq0w~f5N5om7=+EwPKKirWPFR0dLx09ui}!_hICT{j+Wmfn3a#h_;ga?^u{Ch^ zEl0q<<G>*kH0%NA`vhDLf=%;x>OfphgiUWb?v}S6%x>@Y?Sbs}9^Z~+x14rM;e**N zt$Ijl9e(?;6Pyrr$cds3g4LrvI_g!4y@A7Cm3Tl$x+<|xr@AV!UkAG?@u1FjRpLP4 zcvmGxbi%6=2X)A+5)bK|S0x_SA+Ji{L;SQ8hjrAeaz=I9s}hgsz*i-X=vY=Ij_TM~ zC5}n;c%0d7uVH3&AfwJW!o3}%a^AU-;0Fp^hM@)rctV9^mYyUI7ziShGZw2Qi_`2T z#CP&$vFsr0F}7*k&(W0>&{67(DYm6bgqu6*F!4%^=K+lz>~0mw^qbvhZGxvs&dEJM z<!3ctd_e74TNm1P0WDTox(e@|ZA{5xkmb~iyBM3~Ze45ukpGk^VR}~0fbNO(WCR07 zyy~c!_o%!Um$QkCHe0?zJS9<H-P9Y+R<suUEtQerGgrP*O5?vKKhJ&gWj)!*r4%)u zCHBz}CaWD|PU%ZJGLzn$8>k59XFtmee~b)Jyl7q5To2KU%odV!Omua$tlOBwx{Zm< zIHU-qQGJ`&<Hj7;YAnoJjR}H4!~`1hm|)#T=4rE{<ETBXRlMD!W#?6znU4X+?BzgW zw5Z{fT1Al8oJ#>ynb}l|I;YzXBaC#Rt62Y&fVA1Dlw&fEzr`1$=J*a%oBSeAts+iN zy?Ei{=T9a7OvQgmm+qt{|6I3U(dCP}Xc8ky@XY-(w>jc>OSk-%kNDYj=T8gY?^Qd{ z&AiM1sGNuHsCHh>Ys}o0o^n(Cg;&W+;e@=nN~{MR!}=w4R?8vWVeg5!z~0KZQ<wB+ z)F#{_wY-xT`-K~d`t>(+{n89%Kd<<AnIysPikYNg8ly=P{!)j2KG&fPed(_|^qv#t zZuKV0x4gJ~t1KdBCMxUOmveo~CaP;}E7DZh?YOAAegH@{<RDZ|^@r`LQ;gLY&+cy* z_v1d+DeiyZ#s{t1wg*wEWFlQEMb`BewIV=+^{Ojo%Gb~w?RK1l^Ztb;L!zd3heTXy zeSJD4jLj1o9Fwf$5Fp=K<LeZJYgNpHat+25q-%9d;pVU=rtr)giYdt0+L(flt&1rP zlEX0tC0id;kg^To33(*&?IDhjU2ko~mweAbn^&N08#PD6tt=1fyNkRh`=6DzS8}Dq z_V&|Ua-KdZX+v_-7K{4if{sE~%vnzQ^NzxDD-D4vnr7r$|0*27dlReoCQ#@wLU<%b z2D+u@RCIYa!uK`m5`sB-CNWw35z;*(hdzb5TXu`8aV6LVm%ORwKNPI(rCp(4p}^(k zaQpx3`}bj*FrU@N5vxfQj9RT-A)akTT@q~SuhG#p5^=r0jUE=B25VH@wEwX4VRy*n ziXI>Ry&gx!*GK%AXG<T)xK&erj4sNL5rM{GK!AThOqwT|vgk@^Kg*@7y@mHn&kKkk z1a~OqEu7HfM~^ugL*%t{np`82Y<GR+^HZzSf1+liuUEz|JfEZ|sdmIIMFzR#!_`y% zG!a-6J+}LBy0MTx@?OOAL?n!7vE~c)_*<XQ8eOG7NhQf~T^`isfG)qrWtl0iX1&wI ziQqp7gtU}HKe0kl)W;uDrUVojfEYN`6{(h(utInixKIkTz$Ai@<@EZ9zyU-Srxiqz z78;0!uw+rFZdky(g16&?O8^u%tHQG}&nO1OXx$}%k^-C<Y8#9mr6D<_le&-?&3G0w zsPUGT9<OXg#%y`IUNN(4mxN55G5_6c7H67`X`>|zK$w}P>NnyUhmv5<pBq2(YU$<Y zUp#Zd?o<|Q&Yl{3@xq5oXU~ki6i?<=$ux89`Ik=_L`w1nyn&oELkNHI_8n>LODXI{ zsVMm`WJQ-yLyf?s2Q|wJFv+jenBNwxh`kB@YccM~z_YKfi$pXvhLay6(Ss8p1VoYo zLVq4w&KMmq&u|1xKhLDIj>v^AP|*u}F$6{5>Q66z5g>}DabczIi$XQjZG|~Vvs>?u zR4S9P>0N+G$KU3Kc_IesfRswk{+Il}dcCB}FX?iNOFW)ph?LH1?m<cN+hlblT4(bu zbRtO0aEjI+?}+M@&Yl~4(XjO2_14lS0;uGF^28`Ahhi23%L*_ICjXUIt^$FiwyCw) z%C{FD0A?PD78YqIyD;;=Ld1J8qlxQoOCe^|pAnt`K)^0=jbIIM1+b#DwQ{)3pM34x z!lk^oC<rE6zDr^LgR*7c+$k^vEOsew9So9nafEr>OUQEK+!0;w2OZ@*7UFF@LZ8*U zgbo)LiuvF+TtS7%KA2_oic<RGjXxs&AeupxfT;i6wzs`S08dt`0WM?1`U=&}X%)}T z|Dppj#!tKjAIFn5si*711vogIMyp$Lhp`X0j~4{i4k8ReZT+IQ$#bjr(e#1v?4sKF zfX+Q{ebOGSc&9R&)QXXcK^qDU*vYL*yvaXCA08E~4jafg5r};tuxz9pX#ekmy<ViV zuYr3V5v5bClpBg@H@QfoA$Hk5Cn%@bK+-N=FW)>QKNOw$S=5e@8|)xibZ$_0A?7tB z@u+FG9&>!CJXpjSr3$_t?vLyBmKuMTE?%_Tl~S+jMWuG@a#)v9UBp4w#o6~%V|5|F zMEWtSTx{KsNZ<#_i!6*N>w++RyPI<Ly{FUNr%uJE5)&K}VWD32SIv1kXL?bNNV1$2 z+?H5KADUIX;+Q9mTJqm?`DHHVTXnK+B7|aG<e0}D?H+oiQLnId{1k2uTy<Dxq-$E6 zbxv`@`xmrl!pY(F@bu==I<1bhg&8&z-!rXaIO~-Rp^1%t^}{F4MjKn1w5ispbLe3! zH8B!g_2ROICLSOBA#VM-Yvq}hfX;q{_G}e8dyGU_wYIQvpdTOOUD)9U;l6jWuX00S zHR$cGf&1}wSc}17ZQ(I|kT+v|*vTHPuKrRpXhJFOQ;W?!6@*R<vAkjo3(xcLT^5>F z#`H{c68-hpAXA?Fh0fGdQI1(9EbF;>@vP>?xgO-oOxw^h!dI73zo4a+@<fIzcQOU4 zlNx*tO&IV{3KY9T`6+IMv8-{}Ax}I44T9ZTkLfBd74jkHrR-is<~M^Ac?pbZpQrmJ z5xcZq`TD|e`*O;;^myFs=5f7^EBXua29>aLEM+WSp(*3y^T1&OXY-UcD`IIpdgMs= zbbF%3f#u9%=JA;n{OOz86xYLH(V0jmLL~ozZ<uTM2c$brdDo~mkya_?K+h+qPM>+z zt2!b8dEVvB-nY0-eoJ}$mT%^h|H0Qkq8YX<GO&S|`y2X*$l13GW4C!s!L3$|m(D*; z`2{lytQ%$+BFG$THp~Vhl4x!5$n1ii4u<1sPnaxLS?@8#mc1c7zWouz@7*4uR*8=w zrAsPAyR!HZYL~Pr8w5OjORP?89HxWYnw~z|B;38IFs8s*cuTII-Kw_U>1lTqFz3Bn zU*MsZJnGizSUwsY4ob;JcABGJ?B$}ZHn`8O4%=xK9xX5(tP@JJVMi{4Tvvy6_mfBc zyR?%L#%ot7!WF?nZO0`LGbm4YD1Udje}{HgDqO+6Omq7kE-3;mFT!)9Ch?Nk@@l2% z=OxdE{9?*61BbN90K;E#79mmoeU3;SPcnZf73Voy$TY8$(<zubnabCzYEp$uB>&P} zMGir{!kyRzhwYH6OaJ9mPnI5*a2`F2i<V<u9EHjM{%X7ay}!qC3L=pEk37+gOiKL+ z$%|VGv~-QdWhyh>_*HTu3t%zlS>1j?mq}edqRSpGaqFgu@p0vKRTQT9!ai-2UYm@T z89|7R__z>+8W{%fW0%i8>Hqzpi2M8_TsHsj>%X5+4-Z5axPD6OXS8vg1Zz(i-#Tcp z0N{EFi1oHKKpb2m-u_t?5RPEu8bixQE_RxERixzEpwQ!kQ{B{D`6g_V!#vNx)|xea zqt+s1{!KKYdBBX(LS^!EywaXVtJ$j7S~;Xoi&Le*IZ_dkdnzB$1NF=lJ^gZWL4`zu zmUp_MS+`5dJt_;Dy)`r~thxs^6TvtH(Gmgm*Yh(=0(2^l$TEzuANYaUVa0(Rm>uDY zJ~Tzl4XJ(<QKY~+@d;uN)1@cUCV^s+wm?G`28EuYQoxEOA)ZvB<UvaVy%zI=xWsL_ z#OL!QoZnFp0lk>u_a?6`LOlA&=p)C^BJH2WAQX|wKO;NZ+Jy+>D%5)Pe!MuvzoT2h zytP8fX6Rjv#IlZ5u9ohST>)Cf<acTBCpF6^;;XhJ@=G5L87J7biMRwP&A4a#N9YQx z5n{rj7n*ja5%v3PAMlD?r9JjHxA~+nugggL3K!?MBCx~FA+W#f0I$f^1GuVh4X^UM z2uwsVyLHu4vou0@UUIU=KhJ;U7kVE7LfF9}?i(xssIdMCJj<?nQ@ltUX^R3AJ2Neb z_kigYZz<ukd3L~L?2!DvIt(C9zqK~pctT{nwW}ae9Z&@Jd?uN|FO|2~+WNAoa9$Y3 zFU|ieI8%0f#7!SAkF`g1c*xXp2g(b@3fO^_XNS5se<NJf62ZoURBua<mk6m1ED4(D zjRJbIk$Y%0sZDW-K&jVBdB7J?8Kg@Dw#IL;L?kG-f0#>`8e0!Kdi3zIBS)U<$>@Op zVyPrko8|GI4<m%i;$Xu;^QntAD*daqo5Uz1;4<Rg0x{Fe^_Byg)ndjX+?f&Zh;;L$ zdPs}I(z{f1?Yp=fJ6gP4Wjmp^)ODVVr^&8O{xeVNLY}7Nmij?7AryUmE_&}<bLHiG zzI@}uc)-<Kxs_*M8544m>KI!8J4i9uRNJY|woPM`g4%SJytuFjxOEYegh-^9taB}r z#OvJBv9X2LxpmT$^#(>X<NS2YT$_i@xh<mlbGAnElxlfgmxpx`m0w<(kVyRe140ka z(w4Ah5FWqZk$>@92UQGm0-3n|!T!7YHul{O;uzAl0bCc?7LE?whDtV2hhzeyl4Hyz zs3Z~s)~B4S_lR}~X=FRQx&<H^k_BI|C<jBH6%Y<GXR9Sm87i65s3Ssj%P__i11Yf5 z_mB(f0byuG8Gl?|9a=vi?iUQueFs7WViQ-4ijJ50w<hcn3FG4?SDfLMR?H$Ca>Zb! z5+2&|b5>XCbIRp7#+b{RUDqv(Y!P!=*~8u3jajaxlB|YJYO|`c0+OB}qU_QAmaK_5 zIc-?d#I4ygWR^`!o^8vX;kLMW$+Nq%CLq3S={AfA8L_#zN^R}t?#SvvnAw)ACkhW& zXx>gw%Wxm9m6tj?R?dbbzUXitN~zcdp;4Yv_#PMjN*|t^AjxUwV2$@t?Uq2pTPI&@ zNa=YK9PP${^Z18Qv%^!%o~0~Xd3v-feYB2EQCpxx_nHp9)5r0U=Y7T`;Q;OviU+5n z6W|*<Pm<S+r623N*dbm5^MAK3A#Zgj_#R0>{wTsCzyuawF9o-HR5a^JkM;<RT7CU# z-}k0{SDAPQ92>nx{gl2x5Cn_dGP`$~YA{|BwbHU(LF;)fqTCski~ZB$F069S<|<b9 zHt%ucQ5%OG?m89N%n0Dr*QnSBF>0$Ew@5l((7rv<V|M*}X-EBsxVV~0*l2bcR<5=e zW-WNtXY`yk9O|s6P#3PP|1n*JVe3Nu^@F;c(dDDMd|a2`<YI+M9equDE{ZU0-Fn<# zRo=hU<-c$l*~f#3r{|S2qunB99LpK9jZWmz+Isq=E*7SaDRoGfTe?(qSu7J;Yiv0x zCkEc5a=Ufu3V$FHA}VE`c|W3O|B;K$g&7w*e*XDn{8aL&9v;=DtP&vBFxhO*B)_6N z6QOps-ZIf>iB!(norX$E(*4ELYa*F>kvDq6pId2p679ZqLveG2kS+DdL(^wg*fY@W zZ7j^1n%Owc$-Sx8-p`t?`n2@b%S(G$#{^$uKOrXXFNp+Aa32N~8c;tS1G7~rTmyGQ zbh7_-_~mZ@ubf>2dkVv=AW;0j71Ff>8FYPN73mF>+giAbI21eKba&k0z>M>Jj&+Y@ z1D6YJ0WoMx8@H@+OE3~uD1asg2A0fN7_O4pL<)seD4HYT*)md-?s&6U*poypPTpw= zlXtqe?_&{97Q+Vg<d%34!FSQ*c*>8L!Go-i9FTloPrt||I)xF+t5Qlmm<5Ruu)eI6 zp=*y;7kA62VzjYdAb?+q&`uvqBo#-upfuRtbE8!I%~c55Xo~2hCk=$Iy|jC?c{9aN zBVDup#4lhJ<OTTcMbGSL%yIystAdIP!FTrxnK1w;#$gUp6~o8XjLXgJ%r(~0<qrDd zW`$!9<p`4=qg}PZ%$_lgMYD=-L2ldj7_Vq2cRi;}9*e3Y^Oj%bL&@)PiHAOUDlt*p z7h*T_mYd-;G{vA`VXYpa0t@5k&OV=<884+4AETL)Ye9*ht8;RpK0`dXXp8uyJ}UTF zUZ_Y8(2E@c1@V(%fWx4`2kT|ei58oFa)nF{5I0Dq3zMlca1h8xGwzMhO2E-k*%Qt* zFDWWa<lR^d>5npI4IM0qD!lj=RfGoy35644@msOXp|79=*=*C*K1B=8M;IuUIb^~k z8s{1L3k$;n{`t-81f0^;dp~m?D6ZFm19YE?=dWD>cA9C`rWa;#w$iG|Apt2b;+|x$ z^}oe!N>+HmR4mT^E9cLjOE|1Gk`>dNl3j12isOrVPhe6aKH$vFk_<ai%i7-5Lnt|$ zgt3NRTV~KW3~21@fyNf(k$aF(h6Z*=&=8*Jg2rFurVARH%Q)edE+VqO$r<P58_g>x zJF5n#7E~GMt;&E`Gft3cNhg*YSW?ta+SY!dneQ~8Y|zOAib}2zjl=#Bg*O-{{e^cg zywR*>*XTG-Co<@gZZZZ1#ypSOT-##+Irs-#v}Ae8Ll)2{gdvBjrD1zG0G4`Z>k(~H zP`q7xVKV9msM(@*JPM>obdCteSjd*2Z!$*}i4bz!kkCV1hm_Y-gWb}tkeO}#Id`fq zEi$JhGP%s)C1&+;f!B6g8wT#fio6xfvuQvFcUzww!E7y0yE?P`c}Y+a?Ck>9vCj)R zucP4ltKtt@zi2oFgP=S$_(jDjBGiq~icO3n@yXZTl1wDg$674J1W5|Sov;*QWfj6g znx{WFf%p;o?JfF5pP4@_xXnbL*3U?Rr7H#@xD~M4P$mXRDswH0X*qwIuxmWEqE;S+ z^ke=WlwMvngj3Q|;vcFn_ZOK(y^dF8Bhs8!D$`LRl!&;-q5{F#&X($QrT)l3IYMou zU70Cqj&nk#yJ}^|rJNqg!c1M-BYRXtN#VB{`RHZ*D?G>rYcO|YX50cnmm^Q^72N*3 z3U?7`(u3+R@*oD|?2^J{uin_F%YI$VIektQJfVx;NFLz9G6U{IG~p!yuG;|<J;)|g zo#>Qjiiw2+Tf7a;&K4Nx^neu6*e=HW9~krB8)IskBMk-RJ?+ASf)r_D0S?DK1wP0D zmUJ2}`Vm`nqEZG;#8sg2+XNnfPK0|MqwZC~QURpxYYJ11zQal$>3<EB!m^+DXEsO? zEe9!<8jKuYLIGlJFY5<2k8}$EMy`6TpOmbB1)T~|Y;|pHNBh^}9%NdvMeuxyWotDr z{>Q8jK|cV`I~2f7YacEeyF>TbW-TmGP9Xty?m@+?Vd3aAv_JN?)li_#Kno7zfXV_5 z2|VUocJ!hc<!$f4slQheb-_JZJ&eqfdU%C@$RKOc5PJ<jNhjz3cDR_*uwAN3?H&df z+>09IZqu+|1r-!fx}d@0VM@bLRa2Fk)Yqq$6JMPL%oOwyUwu*<tn~3dKfX78tcis4 zX&l#MO%I$9dXu<Qq1u;bZgA#ClQ}Y}9_5RxR|ECF(TAYu{?I837pWz`)kmQ#dsMZ? zq&qT^)w;4*b(B!ApeKt>k1sqB-U7w&<~~hh`|r6Hs@`u^%fIbIWuvFeBv*Q<@J*0o zn!p1P)!s1wTYb76hMluo{bMYME|yZn<ka8oHeEW58iA54?5Xfx&OGJKYvX(DTU+{v zOVx+-+V7E1e9NWAYY!j1)TpzBLo&qGGJ8)$ZuTu|$;}auP{qL_FFwb6&qc(@x{c?# zeJzsi8ekYkBkCO`c(9MR&1Fe7U@cKD&pSzzHTsGSN%<$<Rw`NEoWa<L>HeK~2J;7! zP$HYDZDdH%3gqG*wrgc<0x`(35YjY3tLKu3RI#E*o1d`GK=FTIi><&n_lpNX<+AJW zJMH8MFIiiHN-O!By4lR7q(l0uHFLXD_1a9;uK(tPwR=E@#nS0Br_P=nPZqN`_REXX z6Eax3G4{yOJ7*ucWA@P_i3PNW)sv&Td{G_yTe^(u_7N^Vyf}K}bvdIrR!^(Qqq=Bx z-Dw#9+KqV3!G6`ULr-_=a!eOhzsxl05bc;|Cfl#mmaytR)HK6=8&_|^esI6i+zk#& zb(0=g2~`>{JUrwlR{W?uTWB&SjNK5#^Xl8)_Yl9k;QHAe!LCw*i7G;jIDbK*K<9)) zQ2YRiX($n<Oc*NA5U2`bWGr{`wY{lXF>++k7w}O;>!1k!73Oz^i+UXvt@}EtY0>L8 zJpyQVdi_<nsc2h-5poa$Y8A$TKy~*ae~31AagF(SG$B2dvxq&y4p(cnbp+gz(IYve zaxZlVspQsV3}N}45k-nv2)c1wu}nvp6-@W#JkGp9Qc=z+)H|^&tjzSHN}kj+4YlGp zd5Ll2kQu66%y9$YFH^|elGki(Q9CgpKR_kR44WUK34d3xDfUNEnsyb6K%%adesTmw zf+j=KBndzP@&^Fzg3phDa`Lq;=5r!Y6~edRzPL^B238YL08l34O!v33lS22fF=lae z53x-l!Ua<v`5T3ZqdACBpK{Ouinj^%&{$pQ)^x_(6pTl_|0PcD2?ixOsf#$|+)jqx zgo;AOrzGMeE=w$t57NqiqWKdnhW<kZuYUn;ch>$JHw-=Vp=AsY3C{v!(Urg~Txr#V z7tEnvf(N8L{3L}V=Lzn(V*dbCz)Z6zYTH#v)=wChAa0>ax@B%|aqSYQ#8rSHmV5!` zlrMvCa3tV6);m#mVg3}NR;&bWlUG3%Lt+I`l8XJM8h_rP#67^+z3+h%ob)$|T#hb6 zE(~)PGEcBGHewCbOC*;{TQ3T3M0lgErmR#?###beny5(VdY~neXCiLe+>TP(i&>^{ zRjswmSmQW-{EDDXb}C_wLFm*@s1~${-%iX7obn=&lyab}AlS-lH-6V_t*y={U;8f> zH~=<78W1Sa<|(PP;g^|OCS08IJUpr=S&v`K9vi`^L}aJaLUC8;r{A*>SV^q5Yn5`G z^q1w&Lz?gGignVai}PPbfQU-4pOZ2H*@|p(UlmZ(q-cr%_XcFdFhemVcpCdanO+}g zp`5y<W94laF%0T!V7G@DBx8@HHaDXqOykT)A3dF17q^e#Q=ju0&5WOTX<w^17Z!P; zpvUYH&!zl&4na!wnM07?;ULw*oj750we78o-#}G6;~gJlM@wcJ$b1`9ZGwkqi;uK3 zD=Kx7H>jGsG&5?B^OcuhIK{@-$a7jrAze};&e(ik?w~J|Q?u3w^vN!_x6CU-tn7c* zirA}>7|=S<e$}`h;P6s!lJ%sv6n6C4y->7OKhxHyNywuN@BlVUVZmnO7aR8hfvgME zu#X7>(*h=|D)1^GnC?*4z@0Q}Un~<e6oqFBNnKC@ETRie4+fG^-b#aqNyf<Uy@{21 z?@f*fnzuIlEn#8`>&;}ja<#-J#HM1TTaM`EYU55+#(0L7g-AZj<g5Y<MUxtAw2t(y z2#*UziOum87(`8Q7;wf`bdY~$cEPxDQhKHl3T;cxVI`_ae1avuvzR_`L%>}di@YK* zb<Ya6wF@DSAo19{x}lVCzb@8Br$>v?GBNVhqmLadKKDWPV;p;|H&2mUQJWK6Rlh(g zr$N43OXY%|zM=>GmXRruB5{3pys=viYP`wRg6;+V6bS_j0`CIw!PJbD!lHy^+vo5% zcm*3?>KLF3OfZ+Zi;`8htBabE(CeJqXJ8Vli=6}4FA5m1S657U5W2u_I$76t-k~?@ zoO`o)s)TXW(cDzo6J(|ID!Gr=-Th7V$Fytw<1c$Fn)<o|fX-qHma3bxyTAFqogI5= z1@>*GarM4$zHcW!>?kQK1sv0Pt6XjszxlqsaCRlm+vLpEz298l*09D-pE-SQMFAyU zGIpG5?t6c|t8!-F&|>UpBbx-p6$6eMYS4&Ja(VC${Ss4TtS{qlmq15lPV^GW(7#GX zpTUoTBa>Hk;gIr`(^aw8^)^8tB|)ULdSn}!)|W`$al&Vmiw|Und$zCL4{QQZCEml{ z7CgkrlYS~c7W0%@sFvQodZ*%UdJT6LgVLq57?iFqRS2%5Q0~B;w(jMPlDeh3Xq>UO z6g#P(nB}x35i0GWT2hPB2$dtY|H?elJ6WnDk+W24&on!2qL+P25C5eu|B8!so^!1x zCuVkT#+U^ETF?HCE`o{V-|O<9xY+me<f+rozjF3M7IsMeJvDaX+{rUzFDAdKlE1FY zf7RtTxY*gvanqugSTZcI(I#6vbFr_#Q?I0t{-<8rtmoRlV=w*0&VE`<_K!;B36mVu zMYi8W%JxKB%|xoPM4F0dXOIvOP29FKd{npM6OwUVUeV>EE^^FGKB3DcU0&ld!nbpm zWszaTiv1uU+J2pcPF97N_WuM7zMHU-Y)eS5{X;vqY#^ZUhM}Vy2ZuIp+`Vz_#?2ca z-S{Cw3a=m9JhXji_t4bPI?n0ZG_+%A&CrnETl{~8Z}>m)eGWW)nD5sJSc{I3tHo0e z>#7Ze2|^2VMfXAQU;+uR@u6I69Z2|Sdid7F#!%Z7Ch)N*@GW{@u1o%*N$KWr%GYq1 z*b-{^*=OYy@s|_7tc)b6upY&FR_nM~6hIRM8180zpTax+&fl>(pCiFy{!Z<&!N7~{ z_6aPv3OdL3Bdn@VOyIY_IlMzR@7AUOB`_Orbpq%7ZB7t%xZB{nR43twYXlySVVH}0 zs@qtGkjxCx9^Vp`nbz)g1QwnWgPC!AK)a1qo`}ob?o+H~eRsbz3A)TH4`xA^4`e}? zN3x*H2h)hl3QPQeUwk;kSj!4a>?q3<htv4V3QO$B$_h*Dn92%EOlz3}Vk+}>S``B- zA9I6=sm#|O&0;D)mc>+lJd3IPL>5!|$t<SwQ;KRVzw`EUTrS|Ol{xsH;FQ(297WT! zb#;shhLtHPy@)v=qmPWA1TRiqUWB%yrat)uDQ}Ld2r8wz5~eYs`Uw^WmMtW7KtWo> zfzZa-4w#~!Lo>~h9proBW%+kW>EHSc1oWI>hQJr<yC+b{;Ue$^@9t6w3;#rx5gDYq z)mBh`pA>~S(#9xYd~&$;eR?ZaNe%H$DFNdi4PNHs)+K;k^^~wSV^a3WX@KLGh>&An zgBbWnZc=E#hqd)rmBdHuR72~x{Rqvd8>gpeF<l|Gv6U}vncW6xSpy)C1)}ExC2>%p z$9xz6lM@9gD9PO9Q9+#^^FL8QYpMLr&Sz+1e!C!t4f3}*9}`~8|E#=Al)u&ajA6|G z-?X(*`P-Zyhv+W*hr|N^$gUuS6WH#N<rbF=%I^q`A#H$*X<R<i3V*X8_YVr}bcLw- zV?AuTp@Zb_QhqwfciUP;<~>;s4j#<K#&G4{@OG^HzU(Xahnr8kF-&vRAvgP|Ty+-x z)}HK@xaTDg5L^3i{2@(5Yh!;}KW-WnxKHp{xcQ)OHis(@C_$Fg-8{ZW-WpNa%+}FQ z^$o~d14ZAz)s~$*RCL~D9(0*?{RR9t3Y`N1UqO60sFi;}H)USscadRG74&A<3hp=h zQ%H$pup_kIaARrKL6_VSt~{hJs(pYD?=nsghd1rVqUH?HAFVQHa8S~HVg8MNK69~g z$eKys7{c6~4Z$H*CMTElyLX3Avr!$-QARcH@M!;E5Z80WRFZS>2s?3bXdv!VyH-7z zM+L>##i$(^Exs;3?Ld*}3bi^epsnJ8)&bB)-r+=t0i^2A+#%m7PB~OOP}U1Yod(V( zA0KC`+g{OpUDAqZhxLK$ektx4FP7OAf8GAbK9WIa)XBj;SBIiEWR1<&SFKHzIjN_u z7SQsZZVv_EnW^II`X1X_+(E~0KZKf4y<K2L79B%Lqq6U+4?aAt-pPNfLVNI~CR%*0 zMZohKyH|Uor=uiV^=dUni0^*4UDWt4YF77|nxQyZ@!&L_M#ak+R_9sF@4ahvW%4s1 zXrFSRio3xr=zE-rIJVLEWzzWF%y;YINzio&Wk0z-nOx!~xur{mi*w7@$3_k-XRj{O ze8*?v)l2$XJOM(+4BOIt-h10@@8nFUQG&T`#Iq}ZzuuL6mH^`EXU^(1@!91`nC{Ny zXyZGs=YL0!#GSL_wl>92L8ykguTK+JzE)C5g?93wirPT&|0pG+g|z_H+T_Bt-I|zz zW^1N)tv2IBWc;<bM<pIXP7ppe^;V<l@QZq1!UsM^xLW!9Q|v-c<MKyOmmk-c%omrH zYU?tm%d9Q~jA-PvrG!n!l*f8Z-9|sD+grM5gqL(Tnb8}wy7c;GI}EECy*C%nSIuq? zJ!W}X_~cK~{?iPVW3+^I@>L!x>}3n@UiMGP_%ht52oD>bzo)>F8{94Ze@JEEiPL;s zNcI1gz9DP}s&7l*M)KrRy2ZAHt!xC|Sh$yyec_{V#M#8|tA5ID;%8HjI2MUqFERM- z$Ka(Q*269Q3H$vAtP0l>@wf0cNE^RFtdhSFZhWs%ae@7ypRrBeq#sblh7T>4_XMt< z)B^`AihjlX0gN)X{xzb7HwlkpE(BhPVvw8f#;5+`{G+yP0#))mgy{UmP{7r*(5vZD z*Tk!K`YiB5{P!w<<kC|$H!gna6&=Dvqt)V%6-cldKrSBk_PIm@*V@*<Hq8BwI5PQy z4u-ik1v#kN`yh5luRmH~d2_q8gAG^&xDc2LqVvRoioFuQ(Cw9Yu-FXzIb$>MyuG~{ zZx?#a_@1m8_^cA`0B-Te3z`qut!(c#XoLCEmuM{?qvJ$?SQl>MYwD@gBiIrTt^H27 znIN(U*iPbwl<<j>!+8@%1t&||mr~~FTnekfH}Z3&R+z9e#>{RS)|#)UG;<M+RD=%^ zKWGuyIVDQuMN&uZXfeh}$WsZ31kaK5TXnYFbn&@`^U<~Wl0vD^<TFHig}+<RJVZh? zJlBF~xyFCJA)SRHA7-Q-x2?ssJaa(yFaLL2EwvjJJmC=rW^S@~D667YT~fpJ8(AH< z)!-;M)3|26M*}9`IF`PD=hr8B{n)#{4@040D61dc_q&6BD4ua520?pP%u&>*;2^Y7 zj#vqcdIFoFs;)1pDw|66L?^yvqp)-!uRn8#VaUH+e9vLH{>&YQVbSZi55uCyx84K} z@)KFs*_O5Ptd9plu1ojpct+kAWW3p}FAglgng@bASDypICCythJmtmX0fTj?<}RsY z$rxejT?8BNr;_XMvs>y&I{u3qasAEr+mUy#;eB`GPE}av2rGEmK+Wkv;-n;-N8at3 zhd2mRE|c)in84YW6~n8#oCav2BG{i=n3=h0uHl);D*j2;a1WPklVA?e<A%ZgEth}O z{9o&OTl=q;@|7vOo=n4&crX6~o}2ATt<|V=j<osP)M%M+ar8G96KMwV-1$>urI$}# z_;B)5WJTW49$aRmAgSr0V)pcc&ZftUeTP!wCe6#C%FxI}Ke2V<lWysGkG=YCl@w2R z^*RR$wUf{49^4+LfO5B^UA|VUDmr(fjwhG17b2i0uW`T3%+^~p;R|B6#7>5t8}L6K zCNiQTqipmh^t(uHDy&n!{lkU_HWHSU4e8lEe>e8+q^#nttSzjDVHzNBd!N0>#La7n z%r+e-A@TG5D|sSqjwE%!Y>z!A+9#;#oJiIpe3DZ>#o(AZTq3wiSK~J%<HUW%U0Ef1 z)7%Lv-e9Jec~WoEgx}SqYUJ7b$5htEyPA<zLV}TJ<OxcCT{8kN3fBm0I0F}G&JVp< z;bP+fcu~ChR%N_sUF?(iJ#S?ai>VE#@VF>u*qy}Iz^BBE@p9yuU?jC8i4t$)OGqy4 zF|6WZehPN@V&ev1;v`b|-LINOTMhsH6}=d%j_H(Z6DJ-YprQM9YcJ?8swgwWYSlyC zI`*1zcJo?J_v%QQKe4N8%=~p-{;o2RhQmdq86^32gCd0YdFwQUlv7b1$E@b{{88u; z(OzfL-V1m7H0Uu)?QRw*b^+9xReFun=gQ#H<YP2GqXos3nhNVjjMoKqqcl}ytI~@k zPE#oPgS>6y(ev41EOs+Xj9o2_3k;L<6pM#98utpj#sCm^SUaeh0Mb;26eVk|rsP`% zrE<q%2a_78$RW#*JB|9M-w=&h#e!;&(m?ixfDQY>nd=ZPH-QKH9pHoW+i{@MQJKQ3 zN()bVJ+9%c?t1(+Zoa<tNJymIdW`$!@Qr18T=Ej+;T@M?>-ULvu{wl}S<CEuB!s;; zJ$6^5#H79gk8Vbd<LwJ_H4E~v7bNqOilJZel0y59{Dt}u)k<%<DcC(?(rRz3U5!8_ zY}B6N;#G7TGxq=cGLrlAyRaam={gci1HUEK<BrSdQ(BIjC?qy1V<^3jWZ}rEx4vDs zS~j^g^5?lVxADTnF)yp`qVZ}wb?$UrRiL0$4fGvKc^L_EVkDGXN>z0EE?v~3#4E?2 zTmef(0L~a{t?biUDRQ5!l})S$t&}Z&J6SoqSse=MI8;bH6yhoq<oJ+$n^NDdlzLSm zVaHD~Ts9&7BngoX_B3D(B+yCJK%gg(TH-T)hDL$yye3pt0<UhP;;0uN6zx(LT5-}~ zdTJs8p;!{aHJ&rGq&ijx+h<+f{AX;};B{2#KazblY7xMV(jcJVw7Mvb=`HZ@9iMz5 zM$$ne+%UsZJ1qD-RP0=DB7HXMZL{q$?(0mG2v$1vGcRC7(N#1Ea~vXTIhx~oT+f)9 z>$ro4Pp8oZzlT%~hQ@UJfG%Iq<%_zU<6=CVoH}tXIXQl2;*=pV;`g&W&BfWcpf^^4 zE2~z{hXr%nN$Bjx0hD|@3tRiO+u=TxeVd{qaX(M>Gc3vUDF`tC36Ln7651X>2}WX6 z3TyxjJeex8m{%UBPTZ>nqFKCGX7dc;NYaRA*04k!an~dwyMe7EMQQw_sFk12DSIW? ziMi67%R|MNYB!A-MAchmqGDBTLMW%vF^bJfWuYZ=z+%`S)<y&42DaLz71pt8VA}1( zH?0&`-57fpW+N;qu*>B|kT%<-{KDMfPV+EE41#IKU41=BbBs)(LUmB*@2Pw4&{zyE zETXRC4C9!@9kW7fS@&}Abc<~3?ng*O4tqJ&)0XSHExshcQiB8AKeb`NXi2C^KZDW% z5)qW%CRZsG$i);dC`-UYuEM0~rS|8zr0}CDPfZF|!t@}3i7EEtn=Xd37}_)sL)zk4 zyv!@Au&udpAZS&R|HNXL=uKmc`!8Xl<e+)UJPoxq#5Rs(j@uRE8z+$J&QE)~J3#}A z_(|9$jd35p?piPEh1?vSe2ozFUfs-;c0$V7>6wv$|8>p`!&{Gmo0*j}o`n3w+<87c zT`i*!mL3}rdi@zWn41=LBl&KcX3az{^3~tr!7?usEee`#2fcYsf*Q-=8Y0*0_=)lJ z`nbeI#PtykC>FyI@UVpJ7k`TVJ33Ja0h12`enzMll+4Ou9~j#b6%x%#g-aAhel)fg z`Q|Ae4w1u+nb<X4Qe{k|S%T4+kMh4{Q$+fe|5LP@8sG}#w(-|pei&)<ue)Ar`$Zav zH}mhElX+~A(;zG<-^Njc>n8ERu_U~@Y(22qn`PWVe!9YG3zkM(-!0FKD+KM}x=qZq z;&#wPee#N*`6z{}#Czs8KEvk%-iF)Q8v=50;HIL_UMX-Un9MX(5OewN{LVh&cPQ63 zm0hi!vaxiFJj?S2L40TwW|7#aKUE<525&Ul&L^x#%>PS;&Ti*_!ui<2V*bA>bna8W zdhb}I>Nf$hA9FF#UM%)Ih0Y$ozT5eGv;1v+L>ATO5L@uVRqL1)t}s|6@U>uY01MI& zI(@+Dkt{TcHW&7(%t7ZrBp(#yAC-T|<?)6feaNOD5{GSBBLPi+B((l=-_3iKxN=0r zt~{t&<8^H(EFEPp;a|qV<Cul3pOu3L_u56+c@(D}zximm!VxgMIg)?#ao+sx?wh~q zH-Fo2Vs&C1=(0p7Ci2z(6y(@nNLRYI3|hQpRG)A^p411_EVf#bN%$H%-OYR^%)ctX z4hoDr3Q+qTSmFfAe5iC;R-&a$N$QRvd?b3Eu_P$XvaCGXN)P6GT}AEhFoKZ>y+yM< zIwkK<SPUE=+Oet_S!Ax$Y#kgee!RILJ||xp>}`GOX0hEAS(@_q(grR*>2<P(I<Ho| zNe$&HN6y1~=%e|n$XAm<l5)pLJuqH}0gen-n^Q^a?97C8Vm6z>v7&*e>NQSD5J{A> zkk01o^H97SRWujv*smsqGwOIe$wS1V&M(r)cyzrKp+2{MY~%wZlg|omTTOCHx7T&C zuY>59cd}PoG%fi-Zkb{7YID{&@ExM9niERCthZRdAsYC<hdQmTQB&L~&xT)9SKz+D z#DrP3e}&WIr8DE~&vFs+@lME+_&8exCAT48<fNq*U(n@OsigZh2inFUvcmYPPJ00C zL*6aIPL(84+f+m*PSw|a%3hB|&gb0>Hb_KA^oqVCwu3g{*X^LU**)i$`AihQ#dG<2 zdxLA%X#0D|z_|a6DjcxQ137oS>M~HLx$CM{0)FxtwLs%M-HM7X9#6OQmEC&$2eJn8 zDbCQi7GvuEL2`YLeT;Y6^}%qXQn0f~?wYHuYo4~W$z_ad?bs|4MO;Cuo-=!h*e8FP zNqEXhb;_KKJJq}{BL1y3G^}1v5V_%1!|+o(72KA)A%44%;J5U#RS=m<fp2#e_Oh>h zlVhuIB}cjXX{UL5*EfJXCZ`VlztQd;x*tSGcCU40-4qd3?&Dkc^klUz10n8HG|U^) z3pYyQu}{8su^<YML*>7gYYPG!v;-bo2%Udo0nksAvH}biV(ulEFe3ryFgM}b)xyl% zdvB-`kTD~1%g+f#1w{X-ol~ubQvv8JS4ZgHo_n`J_;HgHJsr;1s%&B?tPhG6#Y3Nt zjnb@`e;e?$HXL?BWjITLFNXqTQXZn5*pO=_-7edU!x6z+PrIim9(WHI>)3zDkSGLM z9KlFcWf#J;VM(F+vONHCZb4Sjp=Lejzb^s|=K&6>y*g4U3xDhQ1^fl<BiFv!9&LB3 zSiOyqUq?WkB;u_7<4&{h9JNNXF|){qE^=e0F{1^U{DYPQw_`aQM^QIA)?H{VPzmV# z^_h0@@XUe3Gxe*BP&nV7!|0AEi<d-op^{gpCm+!I-NMD2J@&UB+28iIko`xGv}0EF z5GN#Qd6HGNb#s69@ctvm;-#q6Gu=yFxXKj4bigd{;SYMdhcF%rnXwV!cq4zWb$7^i z!KivMD%zzY#yWQ^)!WnX&vpA1U1T{;{sb3`qo{$PW*pHN(cLXQ>}`zrCEaRwL{FGD z21+Mm1<2IN30n70g<l?|tsH;Yw;mj@i}ijl7-k49%?|GO^c}<rEbhqPU8rcRg#)^H z;CHEnr4Jqe!dd590991s2n>6B0s}g2Wg=a4ga%0GEm`pA5Kt^hidi9hlxw1>Dn>zQ zmniFf*uBBK<61&I!q62f{b`XgP(%#2D;~{H74_n$bCn<iNO_c2l2&f@y7F`n67h29 zUJ?UROzg_<WVP7KeNin|V5(;yu<v(_WRZWD{P*Yv?Y73g)t1hlnxiW_Vv63f)?VDZ z+DHFzA(rmq+toB7EHKEgxq27$@FRx&_ri?}9ubh1hw|iW$0hiv#?9GKApy}<SDg-C zJb}(RvQRK1ATK6m0G|6taJ2sKg$AF=TBVOMI^#YirTwi4n$N=@W_)YL$}Z7{X4$jl zn{u-)H*ThJj^nWbc`k5-K=-u@{3|EOPSvNHhl*_Aoovq3D@85qL&aLBGJ0p0Ghfa7 z;yxqG{BA5KM#7V6Tg=6R5@C7K5zs!=ebLVfeL?D{JX*Y<qi>~GR2Q!`>nc0B2;UOj z!`{!YcdIxc#j&w7F3@)1N?o?gMLRYqZkJ>BwsB{gS>(zUbrwY-WwX<@a^<pnWCojR zX+~NjNc?qpQh0DvgI?YFA@gTyH(=YLC%4HhI9;Hd6!pOqJbpUrvpA2ZF}>KyY_Z6L zTlSO$i0q{?oz^FSSzHV!I0v-OHz{j=bWztkx9QiTdR<3pjyYBt&fgg{(p}1@&DIIH z^7oTw#OKAsX^BmLrg%zjbDFFDEyru=J{Z4R$4IPvn}TiQ?LK^^p-3~$mO^hkK==Mu z0xFCwbR6puMStnZ9_E8_UTGjlwJka5#sNf5>Hy^m;!(44F&6OiQgt#OVc(NjlB;|p z`GPLqmxtCY^75%P7OexKM<zQ`Zt3KRep*5a9~u}f!d><``Me4Xv3G&eucl+4{FJ`+ z)4E8}1zUv6&GPcf$rowFZ;67Pq%mRLdhA)zF?k4U)-W!{tNS0~I?%VNe+$n@rEbf5 zB3~P<VC0MLZ7)1jxVzu6+eG8Ud{|NTn<Rwuy7Y~X%Z1o@HC0%`=29ZMPe8p$o0O#v z6{rXx2mQg=nVO+fjB?Dt?gd(gAY$Kwg#3yPRk1qsCwwW!ikJ1)H)x3<1(%|}4XzpD zgAN1T)Zg}J{V4*;P>e^>G8ReilPKsS)ztUNqlm0-c6C;ZH#x|ydsUz{sgdk81~^0O zOIGRYtN=+UMqK$7xpYrPejTUEf%Mf;iH~4L9X=yQQ$lK7;a~}$nQJt=gofnnOBEZ@ zTXZQR(FPFdN02Gg59al_VD)p2;zdFfHm}2`&XhZ-B4*p{_YgL)ekGz>bQT<A-WC>> zC6#4vUrgBt^G!L>n)FZ@;TP*{6w!uUuy%P;{-<5Ss6O|!$q{P-V{x<Im_x`$RN?&w z0>9+AE@IN+)`;&?YD||e>atfC>ohJZWhPZN!)QW$Kq(1pNtskGAe0tyG+e)^)JicN z{wz&>42?xwTsT56`*ZJOnd%&t?RJIJsodN9jDAMFTv`8icJp$5hS#UjEnC1uyb~Yl zsK`-qeWRq+hMX#eHLHM?EFS7os`4gBs}wA$)$AL}fz3&mvIQiyw|P{S9*J1RFfJQ~ z`Mog&pZQW2(K`~3*^x$d4qaBb@%{SH$=Cj%J`WjyUrkv~>hV5Bl;Ss0X0jk*2Kfqz zBxOxO0gLWg;@$g;^FNF`2wNX;Ksj0{pb9rrh?feURbYp^<w-w(%$b`rep(v>sGC<` z<#&<68Xu9WsQofycuG;!E386DaV87upcTV$N_#U?H%yRy)j90%>JrspmxuFmhU+PE zjzz6?NNyeI1S6#@N{Dg+cFsHgFeg_bqUKjuR*@O7DF`|wvx;%&b!{^`P|R_8MJo3G zq7Er2nK;ONO<)s;h^KR%CKaT;Ge6Xv(~2ctoRCj;Bw;z8Ye3VjCe7FNK21jTzsiW3 zvN8fCg>`G25OdgHg(tRJ>hCxy%dMLKCDD&=@jP1lY7|{wx@!jJ*_ra}WVQT3G$uiN zrXm7!00yva<f!(yQ-o&pWZ}3>$rzxnLMml23~Nz`3M1uAqVr+b&TU7F=N#YCOVa9A zE(1wUEeL$lJiscM;i)%QB|oE)5_*WCBCP}vDn#86Iq$LbJ^dh=-nS<7vdm+=mNuq< z$|4-oC_hA2SWVypwoBpH#!nHB_w?ht)34)g`azVN;BvG{Yp~DS5L^Dl&}htzA)ljb z5x!D^oxZ|cpsNEL;ANp_Aiv1pfb-0Uq}URS2)6td%>cr;*qVp}qs$17L@mb7DGWVS zf-DV^TT;?UPKXnJ2#k5L@p%vz8*M>czsp9dRS|LFNrc=D;`%}m;$nX>)ok!Ka_~93 zys18O!PBG7DJqK_k>eBFpLh~ql|oV2uJJ72+v4v%1)}VIFFF|QF`~>@V<s!Usx7!( zBzc2j>>|m`|KojP$R1)^6wEGiE4JX^<!^nQtk<bQN4%EKIu}cUc$tC*+=zS<<adIV zX|Ym|2ROmE<-y;@a|eo<=-rbLvA`^q^6qFdib(b*h3|l3Q(i0L<I&=2c&MT<U43#v z?A=Jj`+4MPQ-LW#?V#B|k%xuG47(hPuXhn;PivWDnmz$ACx49@sFS!e;&EW+93nz^ z8_UUIeY_m^c7CT)Qq<*St4Y=WOS=3EE{@DtN(VeW5Y4uK&W8X98rSNrW<w%zbQ<)& zPL^vB4wMKUnKL0HBTj8Y&?Z(RsvbjT6H6pUF?NjlXUybn49km+lE0C*KI#g^mSJ}o zgekiZ@4-FVsbHM5v2b_a18KU_#~AeU>&j9;&yALDUY2@S)PtizL_Hu2l;aWgocH^z zNh&hJlCc_81j*12#O56zgPlO0zu(nF)4^Y}R^K=ZS|GglV+x`JUV{C@L4E#jx}vD< zvUPxb{*B8*j?PQJxFzC0GA>^m4QPpay`>&$w=Ku~x`-vMySd}aJcH|6gp*W<lRxVV zt$e;NfuNQ1nJXNaBXe<y#(_mOMa5cd!0kHy$t!SE!aW!p0Adb}1p9PRp5DcD%#uUi zx~=YpbUn?feA_HDPO_)|P|=#8eADvfE}-qXb3e+}!!l$<)-j8XVnM4ZAO0o0Xbg?i ze#T<v$iYMYORF(l_tI_Mv}?7iBj6;MKyd2J$iZ%N;)bmQz%lAQxz(jup*Vta@}P!5 z=vb{y2Yf6Zf%RFf<s~>rY8(4?s(7^R$CzM`sIW1TLo8X`1A<{{xR`fIzp5AG$rOsT zpO0N-l+&|3B>zBFO5$5)H1dyV#~%?ZW9e=vMI$gYo7fq?i49F#1~&HZivCLCSj4=U zYxxQ<YN=<aBXu@HU2fJzHb#^p#AY|D=z1nazNJ;l^1&#U>W0%SI2hmCD2Ik6qKfO* zwnS9%1I7gZUvuXdn`c$W@wa>1ZY`awgLQL&HX<;DOjtxC5p-;0nS*Y5TIfKRm#!;p zw0*nwZDlpl3@{ND^#Z-}Lhq176aP$O6caCuKm=nHBj8MoQ6V52y-*-3e!kz|dH%F3 z(|Gfa@}8aNobx=-dCvKr-}(JN_&8f@At?+(am!)~k^<u)qY{xdt{0)998SoPOHa5O zECQWnoYm3%u^Wc`{zX??QlD2p<m%8h_L^x6VST#$epjDstcK4FFA81a)ox0ZnDRvj z-88=HCO3_*y4_7NQ7W5mb5pdXoHYb0z1J<UNGe;<N4~TAAy9F1&${8}N<;O?uW3ac z{CDvXJps3d;(GR34Sgwa`VbSI<5R8Vk)=j6U>DIr;ylL&j~!WT!9q?Is}qrqm!3|> zlr+|;Nc4P#ba;UmgcMg>^u?$zuNxGbav@ilqi26nxx1A-s8wV05Wyk5fp>G=?TvhT zY;uCaR%NYflQ(G))Pt9}-lL}KniYiRZ_>?<m{vSZdX7@_Shh<>A-YF6rbH9Q1}aY8 zpV_18z~f3DBdJ86*5Ws|DM!T=l-W`Q*b{U5ls2P>C+YJKgdW~WZ)>YL#J7$`gAv0; ztK|Er*x>QQmK=^p77pjG>PJJ_PYpKZb?y_rQLsBVaG?nGz@33kOb^R*w0Sv<0J2jU zkL@rXbylpUK9c>w3jo;HoA<arLhlrI=2!5%n;3B5j{ytu!r&PI&b<FnOoV{SjOz3x z_hvukYkdhhm@I&H?K-e$c*LYd@T{7)>^GXv_Oqnf)AZvdO;0bqs@3atv6>uMph4FP zDF*$kTxg|-AdV4b=s^l5uOwXq(ZxInKT`o!#Z({wpRFDLKq}dJ@G=X!i5Ow5t!E$& zlX#A6i|4SuyN`*R-HtyLC)pRpJP~=Drqtp&y}@c(UmF=ZXB?%77RiM`+j^SX|B6QL zU?_&-sJ{oeE&H01$CS{|IN@ZOOxBAWs>$c3TRT$`O%&4{hE_8Rb414x+a9Ym1ig~% zwt0d6ijR9)5MZ~Cy4*NK_zxhH-N<R%{it0G4f!(MA&J)I^gE!T#QVDT=AAap#GaRg z^{w1goea~N%h}YB#G`1<o!_N^t8NDvMV9!k+y!C-(9r?ZYOb#tyg8k*>zPk_Jao(< z1`RH|N@s5kSBgvnVmVWoj_JFXE!;NG*eN==2Blu|N*0<dW=OsD4821m!T+8Su|piJ z=k+RzgcaB9la(G*#Rcq9IZI2H4EypK5TU_&dQw}Q6{yPCGo@6YqC>}aX?|jQC@>&E zl6K-hXqczCtkAT@nrZV0KSSU8ixIA)R9xi|);1)p=n?)Dnd%7l;f#{5P1W_yy+brA zBO603T^%#P@syUuCH8kjh%ZEH`>2pPMqID1=~{DUb)rhiqh%zuO-pDOgcD0z>%H_T zEirWW68EDghvjs{5v&<Ld=!tRGtH>*{WM2YAI_d-3|ayP%ZL!5$K4V8Y{d!gqj4C~ zn$*(VhB4Nyn(8l*nEb)C^#&|ci@eNM|ELyvW0-@=G;75jb6getB58-)l6$#HupvoN ztv;B{E&EqV?OZ@fv2XsHMvHfO)@)aaFGgC2hJ~Cz*y&RCHUuG5*wdK9rqvXN#wB@E z2zW3pKtXD70K8J&XmdX#5TTnOfgZ8<Fn7jlzn;GUR}2bylTDMv(8Nw2>=x(yzUucG zOq<u$4q(WChWF`IQKD_}zE|`<<Z7Y<j8d8st`<A-w;6{7nPRMM^>dlcepY}->6_6P zCx#p?Z3G;wn#gR))w?`nI_YKM^Y5PE&~z-2W)O;+q8pz%wwPN$7E$Vuaj-*Fc9mp7 zqK0w?YfhFMi(|MfG;Nj1V=*<JnZnZDf&p&B5-2xZNrC}$_@)bmD)?5@_ov8*5Kuc+ z2qA?|Tqz<sdy2%Yf4T+n<T$442!}&Y@=G;3p~rkuIipTJVcF*7u+(i{BfqADmuii? zmHySb>a2```UZ5o>k%u;egAw`&055aaqU$j(x||#I#>r>I(MFIX@x{h;_DJ&0FVmn z26f4<c3#KgW?33m*9{o=O`y)v=4OBsDI&mmFkcL7?4S>1>b86VflmQh-`2V0w$JCc zog?k80DAE@uMTWD=-uO5O6nZ~2l~P#y#s+;g95@9Zf>&P@dILAptpqu`Li3rcQ0u~ z<j`46S(twHwm;MuC^d?Z1Juexrc_qEi{Tp1m9GZyf;E=z0JlWhNdT~rL*lPXfHvYq zpf`cZ{!z`3?WVk!PlXCjQ!&%pHZgtNL}3}bDD1&P;hRM74+$1Q5NTKclP(|D?5&~9 zrvGr*VT5b2m6Ry2J9f9~N>g30oR@TSomQe7^pJd^2O}&FYnhlmB<kj<WR=C75IX5> zV6Mcu@6<9Fq(`;-r2zb9z<(`Tz5L(vSrkavA-GT9I_xFx?@8dlR}l>PJh(1_4;dqE z>^S!V>9DxK&hFrRp(qO4j#|S`A>rOmZv;CgjF%|rQHTGpU}TYm{gO|E582TSg&L%U zjK?)`<Gk5S^6R57O<$YQm%4hJ<}H}wh~Ko*42h$ul7QG4YR6j~Ts})NSBMuwQ1O;x zx<<<BVlJ2Nn?mlb>(gAFZe1bUh5vc7Bsv;0I$mkEmfCGBpE=zd2Jz+MTWRAt3uaDT z9oNi>7Og?Jce2(X(ZZcvoh}G7@gE{=K&qx#Ec0X+-~dmg7Kl!%!{yQ?<Qt}v916qY zBvps(f;*5>AD@&EWA3{hi-=&Uv++6^=9Jpe=5DZiL|gh^l1<Tw^?K6pC6bakg?K7k zM=pt`pp*BY$-=Ua;}(Z%vnM;6uL3^=`{wq`*(%s&bRSop|Hs4Pm26?!PEU5QSwX~U z^UCQsz3`K~u-`Ad6)Mkf0l`%6k)?m=*=YSiTE|ZIxw3mp+pqABi@7V*_}_}VPVb6# z;QfrjDCjRu)YI<Fxe}ODNFO@zRAnaktOjy((Vr&6zQWvR5llit=q6%-T*V(oKsgmB zZO?L{L<D)R(2Ejc-v9|I)mgG2l-HxI9ocsC_@YS(W*Z}HA!*x$E?pK$Vk{3MRoS7X zW+fPf{&7%*E014%;2LDw-mZ<6CZ><gFB*XlZIR$6><e33sW!}cKxLL-J)+!=N}f=% zMNJ$Kd0IJ3w;h;7kvb~zk!N)|rvwC7F*kI`f|57$W;-2^J`2{rj*eyiYc0u$YhALY zksn+q_B1+EypC8)B^Nr)bBZM;6GRC<CHmULZ=j<~vS|Vz+uTMVB${N0gkRDoXw{gp zlDO0Ksjvp7He5oDdV>ZS2Sqm08p3ans2cHI=J2QkwNQ0@uc6f{tDOh0wF^D1KT>Ip zHB7jm;0_PN=SvAt!AKx0R_!e+9G<-ei$4_F4qwpvD4o0k6(TCn0<uFftT+f(MO*%M zXl8z1Hh@yV94kQ(y$d{8q8$afr$=FDooFTDB0FcthhsDNl$B3NCx?F~2T6;?=@2K> zTRdPTjOaUJg-=VPV`4Aah#fYgQ<0{gprN76$_?EzHYG<@o54yI8fudXoe12}*R`31 zxSuY4Nr0%uS?lVPtt%>x4M<eGJ2p9<_Bc%(Kts#ifF+v#_$6k1wxs>%KIHA*d6-!l zzSe8|XW`M|ZdjJWametBIUnWzOa|BUN9JZ0?mXi8!H5N=Mgaq+`J@J)nwgojZ;6nW zxZ5gv3rI-^j{pmUNqlEKqD2;1W|rJp6)husfF6BE<8IOor&u|}t_f#Xjk8DqkF~}s z7BNn3U@k^cmu4>qSe?j3LtqD6sHHvZYOh`CQipvH%ba_<utUplpmj1M;qKawBNOA3 za*?TQ7p-~u!f4ZwyCv@T-X2tdxfjen1{b2AtFr+&huGoRO!KgvLDR!h!*a!$=t2F- zYK=1pT5^Cq1UwWE_k`>5ww)56=aBmmT<|$vYKw`<9Vb_rTwhYuM$y}+ncN?0a)mY& zf$B}UAG4@BeT}E~UNR!ML-2KVqQ&8rRA@xYWN*|(S8XH28MKQeuTVWMqJ#`3np=c# zG@!)cOF&Wgb*vJ~N4*6<&w~7ztbn0}XjVc2)x)NuTer~{qhX;+FeMyuh3ptZIBxNf zWVFa@?a!arhwoYy4o-KFdV$Bs=KBg`V{S|WC8PJHQKGaS;(V_H`(~v?>6B_sI0$hC zxgd6ZnYKBc>^0aHy4eP$&4~6Xdil6uVm-a8b@r_q#D^ZwcOPv~2_sb?*|*V5GYf?^ zAka|WgyXQZm?qeVOO&eC`@;@NJLys6>0_9m=SE+}>?HgsglMB@HT33WX$vcM4+WyV zLR{D8L3^5hoYJ6a&D7BO5za~EjeZ4&yo?JLLX6cUp754j2eFgHaIgZPIkCJ};y7~W zC|)uXC<{2<<4%d7lHWK4Msi|DHD2N@50>_%G=Na}wd|Wp{;Hu=|L}6-mQqV(Lc&2! zEhd_7-Pz{R6b=1*ji!c9Os98t3hf18l=KEJVj%CMlw5vnq*|GFKU-kK^i_i+%z@WN z<Avh0qz2aa=~t|!_vy3PJBi#4Dh$O0Y$Ko8d}~@*t>C0>FyIO=5JmuQmizK?@K$65 zB<vl*5Y5Aw;`kh8CC?GIG8Pfjy_!4?CUow4d%?iuD+71@=zOE`XN{XsZVmEdE%>Ov zV`z(%)3LvTd}`UG62trb%9SU}$l5r&UCH}ZF{a!l%6WV)RZcSyc>hu5ey%3>D0fJ? zPbd)s5RpG2PEx#2S-6K6>8F%4ZT?y1zM;fJy+gT2l*nx>dqT;Nl>9=;lS*VW5?b<8 z$~~jRx;u&emzgWYc|6`!M4APgDx94O2L=1Nim%B!Ny-Uyt}W_4x>maaXl#jo>t5x* zdUw6MGvz4}Nx9)@y<^i}6d0@P9UI=vZ*!eU#H%}cyL-;#K*`>o?)8WIF5GZk-{y6f zth=b^lD;b`?dOQeH9hNkF67|J9<Hxix3Q<Uuczl+O1pbHvw!jOabD~H)RF7OZc39s zfk4vhEY6$!IG0x5D`Wd*WjKDaOUF-g;$SEDv~D8Nw&M-U#|@STnK(vMvb=-PNF?Q! zty{NVw&ZM+)&kg^Qg3wQ0=xWYye94@_K1e%Xj<3wv)B;cM*WW5w0JPYD)i{I?ei$@ z@-x(bLN@z5pI;$9RaQbrTL9x8b&(~VuslJhHADH&qoGkRaJz;6N#ev9u1q$>H|ZhP z;<fn`wIsXriJIeD-5;oIAu|<D;R8Wmh(=rQ$@7p;Ih)$LOM;7N10=A$!${5ERcl`5 z)0g62xF|A&gM+mlC7MsJrHfeizD1Hg8g<eNV$89GfwLsrI6*g-%kmiF>Ey6d@<)>L zVf7tm;w8}mKRc>J+p3<BM>t^ue_%?*56fVDK3^4*2&Oa0%4Zzaq}jPLGr)@S3uGrW zigcE}4T(yuKk0BSsSsG(WOI)MA-m)=Qi1X(^hkc~W3kdErg3XDdIbuWU#ym6y+X$H zp~BjTsH~Ukkj`l3mWL_FCS=sU8p!d0lwagrTNbY{>nr)5+}%ZFtuFq~I~~H`&F3t} z*^VK*x9|mM7wrPoJ3QK454<81K-|8~CJ*p>2TF$F4vk01nH{|Y_TJo>rDJB_$HWH~ z@)$?vxVvEY$0Vvz04V5Xf^Qt2!j)oz_)b9O{K8x_g%dG0P8O)%=kL{9y?+Y_`82<P zs}s6BNK(#1TPC1R7cLS!^^vJ{DzJYqa+$RqTaI(>CDCZyvA{P@a0s{BSfJNvq)^C> zh8d}JmD-Oja1az!YJysYPUeDX<~;B54`Z6a)j4rBhgrAJ_ZC|b0!SGoWxrMOW!hxd zC=ou-u2%A}5-YbIXnwD1Pf#{574y){{GRD!QxozKn>g%coV}<@eO-z_;8J&H2ytXw zNsQcRfOhDZn&uxT1%2x2p#@^O9BrnLN>?pYb7p+vxW<dPIf4P0*88U}|Dog+B`+&k zs}J~{a_1{Iq9jvti;@FMUQ{h~MJVKV>>C;xxpn`p>@^k3ZYjG!t-6);D!E+AUsPdI z_HWAFt}?r~>{o73$zBrkW+2h*T9wq5T&eaqs!rn|Gce*A7I}gvX3teC6%X<GY60O8 zJp?1eH}Bb*a=VM%Eh7iaE{@!s?b^OG*zTK0vpplbQt_?>yLLo&ciCchrN!>D#lEt| zzDkRIYLT7LcZe#Vmkb+;j`-KGa^wh1yx^O6W?F996-tCrvh7Mfpk!3Z?MjZ27(NJ6 zlk9xFc&Ai3twbcKJ%r-$%2Fj`{mnMjN;%_?O5R2bDg;+yB&6h|lJ6@qpP<cLFu)n| zq?s0_jhjp4;9NT}gxBzU5lwP5#B~?YvDQ|)*bl1iX6NxAffASeu@_wc26+Rr^?Ln{ z<T?ongZlsnFZFckj$Yjt_m@w}pH?l;YrCZ^QrN^E0xtIPQ|OuX^-bU_5%=-e+nxGz zrl)spz@fXZ8?t^)&l}gB-?O&w&GBrdeP$unzD{m^y=UD(eTBc(1Dgh(=l8yWy#t>a Wc&+wY?Lnun)qXbc_MUUPJN^TtqX`NC diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/compat.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/compat.py deleted file mode 100644 index fd2c1cb8e..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/compat.py +++ /dev/null @@ -1,754 +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. -# -from __future__ import absolute_import - -import os -import re -import sys - -if sys.version_info[0] < 3: - 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, - HTTPSHandler, HTTPHandler, HTTPRedirectHandler, - build_opener) - 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 - - class CertificateError(ValueError): - pass - - - def _dnsname_to_pat(dn): - pats = [] - for frag in dn.split(r'.'): - if frag == '*': - # When '*' is a fragment by itself, it matches a non-empty - # dotless fragment. - pats.append('[^.]+') - else: - # Otherwise, '*' matches any dotless fragment. - frag = re.escape(frag) - pats.append(frag.replace(r'\*', '[^.]*')) - return re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - - - def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 rules - are mostly 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_to_pat(value).match(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_to_pat(value).match(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") - -else: - 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, - HTTPSHandler, HTTPHandler, HTTPRedirectHandler, - build_opener) - 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 - - from ssl import match_hostname, CertificateError - -# ZipFile is a context manager in 2.7, but not in 2.6 - -from zipfile import ZipFile as BaseZipFile - -if hasattr(BaseZipFile, '__enter__'): - ZipFile = BaseZipFile -else: - 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 - _fsencoding = sys.getfilesystemencoding() - 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("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 argment, 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 -unescape = HTMLParser().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 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) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/compat.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/compat.pyc deleted file mode 100644 index ad5586f69dcf2b6dbef9533009b771db5f273236..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31683 zcmd6Q3veCRdEU7XfVdz?KzxdNaVfqoAOI$*7fq28D3FvWOCYtN2<np1?Zw>%u*BX6 zclY8UiFQYHYGs=7H1Rk|>pD*C)}Ewpr*1NRI*naFk{M6aW}38(t9F_?Gj;2vbtltK z+H^YozW?9ddjYae+_bnNiNmvJ&pCU}|NrNIo&Ox<{$N}GC%>Dut0w-_ga0Qcj0wNr zYm9?`8RHvM%a~HeWcZvle%6$-@(%f&Ddm!U-jwpj&6}G&EZOJe%#ty|f0br=<M*0c zuPODKjJw6mqr*Pq7EGyMTK5=#tEml`(zf&~+f8XO>3PVM?lVrWakdzLhpFu}rJY)@ z&-lAcZI>w_-EB&{O>K`U?J>2zrnJ}8?l-0TwO+ya`%LWtQ+mME9yFzgOzmM)df3z+ zF{MXLZNDk)H#N(YEK@sRN(a!U-+a`V(u2tW9yO&$CBN19kDA&+Q#xpBhfL{^sU0?@ z!=`q`l#ZC%QByi<YDH5jn%b}_4V&7CDUF!gW2W?&sg0V_Xga+yQyNQpA2+4(B>w?Z zIwtu6;~zJ*<EC^xZF9nuP8j!bQ+ix#Y%~57ruL*MJ*73a%k$HwbP~^5Q#oavL7B!g z#u+m1X+qt(k0p1EdA)STI6LI^v&PvendeOXM-psJq}V!}VC!sxtzE{)>*qVMHQ0fz z`vhA`D}pN0&2HmQ-V0ODn9?(XlLr%=bl@(*2HNj2{<#F?ibq94CkFqd;NNTf^9jln zeS-UhzAu=YFLYq%oVod8f__l^MR}Xz>sSZAUfO`K51E@U3(8(eP<Fqd=%k>?eTtYP zZ1x#{%G91SrRPlTi~(X~Bo7$>lBr!brB|_JY~#LaoCnRFtO-7wL%wv`)K5$6hos)L zDP2LkhmCth@cc-M=V{~YXKP~LN=q-BwO!Kufbm~5wX3Fd)nsPs5170=W0v|&usxs2 zWSmEZFs_<<##~z)k_LdmHB-7~X6gsh%Fjz>EYO3pK;?Z#+VmUubyIpBwMS69Bwepb zZA|=-@vocO4O6;-p&yn{y{@0yW8AE{IcrL@l6k|F-ar>Gp^LI~@gBP%ulX}1=2FGD z72_N+O90PT^9~4M&eSm+EX6tF3`@_m#u<^!8~O>I{$s|knwn!u4yS)5ozV+DoIb`l zYJAt!=1pnd)D}!>L6MWNJ~wA>E*fXd+yO`Pj597@xM`dZNXF^>)G^~PnVN4(K0nn4 z-ba#8p+YUGK;XH@Ik}s4Q>rJ}IxY}vm{Nm%ETzNU)*BD^gj8snQqyE&3_ouCTc#G6 zQph$Br)~Z~zWao6o-`lD=tCK+^OSL$LMu;m2Er*CowGP;{K(W=rqo*B+gTX_1j7fV zw^nDHQ!=P!Q(9)5PoyLG9^1sDe8%`IrnYKIYpm0T&Zm=^p~9O<1tBd<$nmuC-!iqg zP3dh@yKPFhP3^;`^kMdKU;3TjU>|JboH6c4WOmP{vs>1AXU%l+IY>W`lCYRT5)C4$ z%!LiV6}e@v)@%gPl$T3i_aQeO1zvsO;w5dsk_(>iURi6p9=p(Dh*A?Swj$3jQocs4 z)(ZS)B?#T9Umsd^ecYmtHyd6(sTVeVFKXA5$0F-RTeWiFVifMO8?pCWtw!WV(oJ3S z16u1uvl1=VD>XM_LGo|{1BrH_V6st<+<J7S(U@MuM9&8S(gI%S=P{!yXT%?ZU~&R) z9z!NF=53@IVNC~^zX>A1W5(PzrjA!R7UFTbm__}mkfUrx^J6EAdA272ywIzMQKeo@ zM($M`jvEnhZavMGWj+d1jw380F_MH>s>V5WW5J6STXQ#Ny!u&xK5(6m+?-dxan7A< zE!?=g7A-dF=j+QiPK-Z&<7IE|M(9QEShG@Hsw}wSji%SUvFz5JMsUON!pKL3YNG~- zjW^e94tF1ZLJrPk1~WS{MV1N3ZTD8o4I>4A;5V9pD6##T{c;<iFJ8HFS)T}ZK0RLv zz3SOkwD@AB?)YvXl*bpBD`B|O2%J|I0>K)~rjts<J`0lPo$<5nI$q#bqokbZo@;r& zQ|5TwKmo`xzj)=9moJkF<1$i>H}CmTQoyEh!F<IJl>~_XlmuSK14sb+#!{aNMu>UU z5pQSA+Zl5c+F_2!uP7~mI`T0&+|HV}!LBbcrOKE$P7jG_8tp+a^IVX!a$dqGga}(4 z=uxKEPc;b{XLe$-5k`0dt<D}Dw#LSuwboZSI%*y5tTQg_dnzRG-YAZb3{NmQB&*dU zeabh5@XP#CGiWSCq|>QJ-HliQtBr6XMPRARnyXc!>Z0Tpf<~)ZBy^+^zic1ElYIn9 z7s$1}f;pKn3?kf)#N-At1DPG!!A!3i%0xpbnFQGZ)zwPm3UO9hjeoe(o}WNN60!?n zn=$sZPKDqQ`YxBrSjuHt%;j>e;k0}_wkIsP&0C}+7}!btgdAaSrph@GDP%p96DWTd znFV7&q^sA3XMu!;XPujU$tY!#q(Pr2g^WSfLdKa}dkm-mWDTkXS+gpr9JG!?P;f%T zc*UwStP9!})8%F_>*CE`r_b!=n=L}`MRM6Ga8P5$B^?nKdHs#?*~er8H`)awT5wkX z8`u9z#XhtZ`cr1jWm9Qlu{%P1%16U$rKzMFxJ|!Ob?w7!McNi=Lxynig{e#S`N^}> z=aq&DKBq2q!2UwX%m<Z)Hexpor@|A<PCXP#iyCDN=ro3>^qlF<?8yw|hH`_Mhci_U zn`@Lmg6;(X7d$20ExbyQ@J@!pi8LVW1}Fr=oo&R(?VMS?Xx`45bF*j74Ls+~?H=<s za0`<bB=H1E;B7D~;ctr5z$Nmhl??P<=GGGi|7K7Ye$T9WLTC64=wUlQb8gl)w|nJN zy?1}AS3dQbdwuGk-s4lBF}FTrW^Vliv}7R#d=$fj!Mv0=;O-y+5FLi<6i9YhwBQV^ zBh|ob_n<aG@(k&y-59f-k;eUOjB;nI+1F8hz_8~5ehaM$fg-i0@M!@2svCIoYgV*a ziL8+-*vp7j^y-%5QlLB5d?Ntgv?`$mj@k<9D4JXAx8gt3(=Sgqs!MJ(zTiep*A3V~ zad_AgUh9VF*0n~+Ur7%m<CbM#n6yruJbuy&z<a{9qe|dfHB|H0@I~KmthmmoHP?!) zi<hm6;{<LPqBqv6H!zxN)on&Py3X$V)BZN{Nz20oDqe^-jk+~o@%&ccj$4=NR@g#k zVK^#7op05vk=LlF{ph4aesvKl<aqib+zSA@wPv(tH3Gc0IP;h@M`Ye%Ywjk*`&mDl zqBcjqc5Z5VN~BW!PWUh+RIO2G9g%J!MNk4T>u_K>4L7VGjTEAm3(d(5tj4@`I25)r zYK0H|z!rxCk)`1o)WR^qaDqlN@E|~}_NO_A^#iu%J=b?aYsCf3=Nqj$tTg=5giJ^V zf3@PbR1nDoK?F7#y2w%c7;ACfzFW7+>+Q#rl3JxHTnaocP$iiRjvy34mCRorVrCLb zS7D_t|1Y^~!bz7o0DaS%YmadA_#II##9mGY{Sr#TaU`a%7m8;uRL`9d<GVBY%&tst zZeM06#5$iI#GBsiVM+I9Ro~l&W>?(R=;EcBfU+SFv11cDHpQY%p<xd*ArfpVNH!U$ z-N%Hhx+rCP_(+ju?`A?3(Prm1wPO1LCJ!<p@z@VDc?5~b6Z?KXlD=)uP6x(LRp%5H zQ;Y=rBI^*dT8HB(c}?0@s+yIdSi1o<3`$KQ7`#5e8nK2wg|fTVmxCx(^~Evfqv%h} z6lS2KW~C%g&4zR(5`<EOKO#XmXh@Ko_@|1km^AbdOv@OiWZbbb<apHx$`B#iYC2dD z`ZAB_(DmnqK<6r<+YPcJHp^wN?qP&K%>i+WMpYyNlRq+JjutacriUj*hW#pY^2lV< z7KHr@zV<18v17!{a>Or8pqw<NIJ$$<4%D!QEb6M?0Myw?W+CWuSE~TWe4`6fipj-Y zB{F^nql%{{ZUXx;4s(>rG!stWzKWzhP|0l`0=TYz3O{1{_GSvXLe72}&wt9bM(iX% zlN0FveMxzr<HY~3D9^rvrfs6LU*jWwG}%1#k#;_hpUznj)cm<Lf%5&xz?LV2!$J~u z@8d9Wa-xHZ`I9gM@<{PM!E@mzjG6t=!yx=ud^@_xSY8PhLg9x?E6mz9%DMrAYxwRj z;74f8Kv-^EYUwJoS+zaHO<rnTR-ffKDMMtb<yF*C<~GHDMUSNK)*uKgR4mg)NE(%8 zG=U6^TE*y6uL*YYaazsS*t$JJn`T<8sQn5}KETETG<g^*u?OZU^kj>YZdI&MT%MNa z;LFhOp}UHLt4=j*{h-E0)LmY~OH#qj%5p`h;3b)X$nA?kqpod5ft}R6I!Z}q;aVs! zmfax4G%<QmnOdUM{G|`L4udFMfd<<(gk8t5zQo~D2pKq5^3c%o(7^H;MI1FI%%$3> z&wC46)Q6(UitktE{ChZ8x8W@igQcj>)nx4v05&}~HjLL;KO&$Sb2r<w-!!fwBCHxu z;u{!7%v}WEwYjRUdeTfa5)(db!Lz&ooyZl3L^a|3qz@t6OUQK28)Qp0BrXz@H8>%1 z9*ikZxeg<Cnr0|yeG6ZJgm3mG7Og`ShA^87sg}B{aAZfYG$UAjv`wO5R4l*4p(@0L ztmq0-MYPQbYI8Y)2i)GlmsD8G^PxDVLH(+b;+Y=vP@d@jR}U{|B`qn;+gOLb>ymoA zg|K+^?mxq*LTd1IWRqftvaz>}Xn8-O#I9pNb`6Oz5OpHh4Hh<;++q?iNg-{Ac<dg8 zb%^g_40l0T34taRHaS3!ux8*B0WGPWK)&$&rB}+YUAb^lX6rW^ORZ)|%S-EBKXqpI zMmSQuK6YaTUczBnMI>^H3t2^PAcLiVHDSSKxg%1Y4lamsIJCrs0gs0_D}0)wo_jXp z&<YSNKtC3oIRgelBfOfthHDI>p+uk3G#6x%oKCi2F4jEAAgm`?>E$}zI==XWEqHsP z#*$n2-gJZU>bOTr6Ax!u(y{hdkjOdN6dDU@?D>#s^|9k&Kk{DK7(03L$q(X@OOKDq zYeFi{kEJiQ?wCNmqw<(oc0WY#TK|Xtgm4c!ngaU-#%IImRP|4IWh3wwh;MN%;QwwA zD0y6Y1G0V}W%1s?LvSGE;aDI`5XvG(dhnB*K%K2%4G0Bz7yfIZsvph3=eXD8A(<IB zFl@LJ-D^<H9anJZ9|alqlIB2+aJGIdD;uy`^XK4u&6$rG^RWzfdqA2j!S)bn6dAZ7 zd+0pJ3LxQqoXj0vp%4VRAFn~M=ni}VMd8oTISGNtZ6kPU)dQ<^9{jQ>vpoi0V0o?m z!y6Cs{%y8H?c^Pr%J<@?e-t-G;R43Z&ZT<$S)5Gavyi~42k#18lN%TIu$6cK=`h4* zjDw{S*Ao3HVF7r6S2SE~w0tM+an9{%Liedvv0{ZQY_#ATg;ULk*U`Ed!JB%kh5bKB zw>qi?3)B!tQCe|)ukMbfeR6SPpdrMNwNhE5BbLv}f-MeXIb*l55;cPHw)+zwSn+({ zqR3A>#b|1kRj<~n(SI1NcvW}Q!d7PN*<C+B&OIGO5nrvuD&?>=saQVtT-i^hzJ`1q zGb#G+ym*R5CJ$R)WG#x{xZ;4vtRI~MUgwg+bUtX*WE4#R2Bog_ZwbS(=I{=hK&5Ua z_0!>1!FWADF|<Oc4RFE&ZGc<TZH^r~@zmo4_&nN2i<ktv;hZb*erhZDH}!i_8|w5t zV^g`Z5V(YqHN6J?eN~hN1uRgl?quzpC`pEubPNKjv>nM_9j;2xv8sy_PXJWY8@;}3 z^fiUB0Du6r<pH!EQ%7&&g>8@VXv~Pcg`?u#j@|Q}aGs}QIvp3fNZ}*yZY3?pov*Zf z!KHS2v^~YN&&1*1mIYOC8u>$(vvUG0=MXY$Tg|&7$fjrNJHTy>aGU+YZD7@0YwLM< zmFQa3p{Jup^CFyuVkIfJrE(+8I9U}^ym>k^<sd&@ZUp5J!yCeYWP8<Qa+$4}ZOU~i z%To|=LuE}gVQ^hAQm{m@sG0gXfFdKHcwImN;hr_`g4Y5*1rxkPwyL|8D5U5YjtQ;| zK88NtiMcd5ZL&KFo(v8ghU{XR3N_rLd9#ln%#-m0aA2@}?7{b6#P<vG{eR8x$6rP$ zz?aFNQE@N7xPuY^!@z5{m0@fg1F#!Bo&hVqiI`AKDQAKs9sTuXpm?w^M1}UneQ^+3 z8UgLeKpJ45u3(<VU@027BSj^mBkUwRisxk2VBy!i5aA~aZE}X@=2w(nM5%b|HaDxR zw+;liJv22T&45;Ysoq#=^NdqgNN4xP;<V){>#f_mwG-=l;0+BJezjA&7DEfI(-jrJ z>u4=&Qrs3}Aq+@rLUs#D#KF8)mw=gbvb846#6HM(Bq7~r6RV|z*@&H@jH(<*G|YQ- z2VC9$2pZXIY|f9oEV`%m35tm0Bl5_RH%k>}K*x-P60N2dE{Mq<Z`H|4OJ=5SSV*v{ z>bf+G!8yyqg4!DU=B-7}kuxtVF!pdM(%*rlnBR$|*eg3MLkyLGIy8g@I+WR#9l%c^ zQxJP;5KjfXA4F{l4+}Y|l!s2~?tCB0%4NF$%VnE@l)b#O5x@qSpyr|?jcfh_qisZU zv{zY|@V*kXT+ue{ckpC?oaNNaVm52vVd;;vls(LQFh+#{5Vq4uHraBl^B0)VIFgPw z4b=7uKKY0E37<e>?h{C6`T<w|9qiq4qyQN9qNKnSQ0)~cGi82Ace3o`Xk1KL_~c^6 ztG`ldY6)$US6UH0Dky8xq>`E}M@&=;KBQ$A1m6rof?|Apyvp}9o%oZR!02`&1Fe+t zvKdiH#adD)LP!fVRSzh;xaLGjqCQuvEK%~Z|F*uTJH6D<eA!f#Ma@d_aMpE4y=r|y zGCq=kNJBA#MHE6EhBl3{QiBGYPKFDK08R^Y51ba3Tp2u4OQ88`30x;yBHWmD;7QSv z9)>{Pfe=6;I5=dhghWjVpa`^7Ce7eM-7;XrXnhAjON>i=pDxG46x!2xfPsmwP%rbQ z*beHZ0r#H4THt&6Am3jDGf#Y7oU?fRJVzK7Z5DAn3ZKFDy)FO`uB5=xEyh>T#J<3G zWPVWhpn=F6=^#adgwqjE<)BrslXFp5V31TfQPekCDd19G(XCl{;7v#)jUMU&u$^sW zJK60S*$$F9m&;D03QqDEDrsm;xl%_gfoM4)Hbyyn-M)4;9ucssfZIqH_Fu(YX={HT zIbp^2=UDbv_(+noe=dFTSw8aZrm>2MYY;MmD+{<uQ35M13HT{wcMt4<e{~0)_^2IE zf}^&7o{v(N&Sdk3PPYy?Oee3YaM+|}(>u7^{)_m($_M@-*Li*duYVmG7n{+dy4`bc z8k*ckQ2~Z89Qk>Pvfe@^i-mnuu$U>(Kf?@^s6NSTH7??F0L}s*vBGf3#@%l8hzlQ~ zP;Hf(I3%JcZ3g6VhjH<tZAmM{%Ws$R-O0I<Jv>*!Z|#lGmEgEde5Pa{chYxZO5s1o z+^w@#!lo^WkPNLFmZgXN3m8My2o@gnE0|FTKtTWp*>*S#ehQLBQOXX%V5?A@VaHS~ zYHU6%DBWKtzqgh>ccsHdxdO`x!6k0s%N|A2uY~$Q=|*rcO*u6;VIN(gX(Xm6teIwO z&iATf&Q&{1Ek*|+TnLdqLHuC{b~#2Ow&e&u5sp|~WFpd~QwF)9Ls&~XJ#1A(ZpSE9 zy@LJZR)XrH^mDI4$FW2ZUWj9AVdKTe$Puc-zD0Fv#}8es!%nP6K_!IQzY-v_86ijt zCS+)#IxfN}u$Mv?0lLGU9hMnPVzt^taY$hvgRNu4Rjw(LZ4N&#OaR3XAwxMJ{Jpt@ z@&gMM9KI|fG?tt{janBGcHqHUeUm6mNn&md(~r2&tr&*DG!5Sc%(tFWM0<*qyD+=~ z)OA>e(!31mfcUP2J}ix+B8_3bl|bM{2Smqw*jXICk;f280-|mao5~nPq<j(Yl&2uG zd7M!8{{KAr2SILns{AkcnVdj5<wOd7*mDj9u5j=vNk#kqkh>-te8+q!BD*jj-90JC zHdnd)6Y116Y?DMq(Irzmi_GeA+3P`!+w2iqdus#YvCEi!(=)gFQ|tEwv_A2C4L>s= zy;R>wV8M=UBGLZqO#TLvjS2%La7<9$gA8~cmTawD{v;toPk|Au0~SZ7FH_|-_(Kv9 z7~PKyRvxBIeQOspc-%)nWioZt*f>}FCs`&hm~5JKw4cS-KFyg4Ik&@(I47A8qsTzc zs!kG%z-7+-m`JW<LR_ad59`=pU~MX-tvVLC;8(R5uGuckFV@YlyH_s%?Ei~t3M&FZ z1Tt0oOPsW@B6O}nOx>7eA3lyCG6})^T*ovM#w1ia0W8xc0&K!WNzExDG-J*|^T5A& zYj&MXd7KToSBsjn_tDMuuFy2-`)cME%$zoZL#23Yg<l>&2CBglRtiWN+@=w?*!`#J zHD7H8&we3+OK&_x0tG&8MIXm2;W1*XC=Las9QLM-SgfEjTpw^k;{;Z@{P|?iroA*d z)X52qiWU+jjUZ5v#}TXSwEqsW?;FaTYc%|F`RDI3nN+qM#&}^c!<&lvz*GiJ!qSAr z#OaAuObR6vCEhf6;H_ih0G3|~0V(9TgI_M+F1~gA_OS4?QA@*#euS`ioXG@}vrOJE zi&kvj@)rpjvQfhge`1)kWPxaO+-U|JfNTbX;a}GLSiD||@{qiDGEv1-J&pl5RwY)= zMX`_dbp-n-8!+S<)Yiw<{l_m-I}<I1m7vpxYOZrYRX>zBNh|wx6n25(*<Z$Yzm$?w zPWTle!SPQ{03wHwA>|~?1EjSN((6w8oHhFaLZzngMbw^hSK2Bt3<^Za3u$4GM8H_b z`)Z>J{d}HkZg~CJtZ46nJCEHhQGLVf$4|{d+lD)vgK4`tQYsa)6B)v;x+)s&uV9FO zJB493g&`3wFr?A1FvOgg$&l()=!ehX<vNgcfQb|YGe}Q&AhyTi<|MY>mc2#`rY3-= z<Yxa0I(Z+g!~%u^^p>lOIF<S39|V$JDM%C^Agle*g<_M6LUJ8UWSI%EfH20DC`8h{ zPbN+c8|R#{BOQJvopvr&YEw#Jlp}bK5(AeKc+hDlnfH{Cyb`mpRkmvjQ~L!xc7aL6 zrVUJ4uq!C=-$-Yu9F~Znsw%Wj4!X8u{S42{)Q_YF%_$l*&}S%`65lB#(mT3gC$QkO z6&4bP10zo&*~A|}-v&)+vE~yq8GBIJ!&0+{fKyY5(&~L<7{WK9(EBw)uMb1xp6Cu3 zKPkURVfaD3T-)6NLokdxAQHLcAPz@)LcoaVlFsc;c+#dNKsmgOE^N2fScXHQ9j|~; z01m=xRy_FeDY{|?JZ{;txt`e5biX9L8Cmf*=n3QSAbOr^&_@${Xzq!T@u@a8#CB*l zn*6k2rn~I=8<@bar%1@=;AaIA5><gncwqu4q9|K?a6J-IjRB}2MQdcxWE&N!x4(m; zQ=D*HA;!rFz&ElE1D$B{;5d{WmAlb0Z)sDW>BCA$&?k)JhgvLC8pzJoBHnc1r(@M@ zU_9N@PQHoJ{Z=Qc9_(B%M49j$;i{seh;|~2g*OGoO36{y^Wld~z%^>&X_;=hM5F+g zQKcHihv=1Q2xv$SRkrOe&HgHe@g4!eIh*WMQI4Z=kECPUW15fj|JZ+%2^XrkCG5Y& z+%GZtyG;HblV4!+_mK#97X=ML=Zg(TR6@~dL_?(!)m+1d%vV{Le2b?caqMu-{zvTM zYfQe*gzL&C#%zwZEvF>6X_lYtLVTE@;&*$u_GSxPaG<Ae0Ec???~b0qo<bhwdHkO% z^y2*%!ESUPT2w35MYl}eSk?%%lryB{Mlqa9a4dA5z7_!n_5k^%_eEe)!N9MhCSv?P zNH)zF4+L|gToeGP0eh8MPwAFzb4{%Ls-z8Bo&s;2c9$anx~~p5Jx<NymJdc{>%Ka* zE^M3e3J~m%ap{U;%$rc8jlO{>2m*MKb?dw}Kku!!akP2p`4)!v9inGDGP(`OUGW0U zHAMpB7A^(Y-f*3BP=9sZeHw*2vp(b?rNXP&6lou*)kgy2B7}@Q*}sXWDt_b-q4N9$ zKD!^^cCoc1sOsE~iZ6J>fk|u~^~im1f-OEGgMBHqy4SvxiybL!O`+P>WNT_5-ju?Q zRD9za_N8<$3Y${83x!LkWDANn!0G-I_N8|41~_*Yr9Ccvb9F}wJ!41e0ojy79(z&9 z<GwTG_a*yMDABvl9yIPlQehV>fI4v<94;y2;2+^_W6bO~&R)q_#<^cI2Y6W*Up>nG zEvnz)FcKml-d~Uiy8y>>YI8WS0)83OA-0Twt16%>HY54vr3o}gXW~<lF*w*X$8r6~ zxK6MVB3Ts}TXHxbl6I>ssVwg|dK!`y7ZM=m7MDR~G7IP#%MF|T8o|Z5t(;kqXs#jz zAK&#D#^iEQO0*Z&*2h6yZFT53Fq+Oinz{}fJ6<%gbc)#4n)Vjz6`a|Ztu1Pq5=4q9 zNyHkZJ4f7C3EYJiLaExVJ#I!Z1`>ju7uzsEwZ#b4_7Qw+o#Nm+R&z&~DEpdos}*eB zP^*PjwgIqI#45p@hi$K5ZNuh{m_cHo>){W~23vi+6Tmv&{{E=70A1m*Go>Lm)X(Km zfy7spJ62k`95fn{{Rvh$NbHdvuCD-bDR(NZFO81^=h^U8CR7)M1ud;OdZLLvcZ1td zB=&=GOJtkr-I3V`rJI3>+ZgSXsdCKpobmt33DmoR47EJ4@hv8JG3N6O-bVBt>@|(v z#seyW1oH^%13{n8>+92`KyfUcCg&HQ8+(I}p6evX1NchAfu}9CsfymHwKi;>K6B<- ztKnStX3wmFv}6BA?1}uBc(#8ViNru`unWcGNn%d=wBJKb!2<kxT><{rFn|XLe8wr7 zJc7v(0yV5#J>(PQ$pZ8VWYj7Ku;7}^5R3^V!6t4%X5t@iD*-G4dWi@+P4EIKfPQ<O zTj)suo0?n21ga<@WY=b8*$8lBxDuqIxTup;NcaNE+8~X4lSmr`1um88gK0m(FWwaZ ze;tE7L;zDLn*25#Z|GNZlAy&4Q=P!uGsq}J2|sXP(s9<T9u%O1H6xxDw*iSQx$kO* z8Lh#Ke%i35R1nz0j^hmlF}3ok*l>mwto*3%&)OtcH39{qDLEp5B<Kb&paMLWk|UxV z`w^8_`2Pnl@=$>nXayqEb=ojXN(64GX5@yh|1;d|e}_6<fLXkak_@+8e)0#vk4svX za}Alb7tLy7JgfKO+-$$B-;6nNYiF{RO;uR_f#N99v!)oYee6^~g3D!x*axLDaGlD4 z9KAuvHMoH6oMzB4b{dZ3vw*i+Yq&D)SsV?h^Xy3C2Z8UDE(l0-dOlD!7KvQ{qDqpK z#qJJ;c-4ZUF{489A0XEzXko2&1pEr4?E-Sd%sNAaFjCsUk+BCG=?LA;+y~Ky6Ha(# z$Qe>T`vp7zY<J%lMVL#-Ik<yfTnDzgPt`5S0o*_nxNXjyCI=Q?ak^fVTrRE3oE&dr z1y)5P6_DiF2)4(yQ2Z8(d(9ard5T9ofa~8zNIqWU5@lNMq^9uakN{7y?+6?RNG&dn zTFb*c_`}PUVz-Gpy710j!&}~PGb~Q7^`SMF;r3E}OdD&Y)XNtyTvBzACrBtPsdPmM zN@h6Jg>`S`CYKFrn8ek#)kroLe_308>-~G2k-At?L2i?zRP+#0D$@TAbMGNh;SF(P z|63OQ4in0yZux=5!oNs@voH$N!@GJUq8XgDAF<3#lfOHZuVzq>WGH-rY5-OLj*thr zngJLF-a<uha!86L^l&vCwE+Jb8f%WyqzlVU6<UmHju7CajBfQXo9d4gk}y~>$8)no z!td|^Y5GRi+`{=%nSr=aF==Hr>!+<{@x=L!_kjbO3bKw1EAy_Yr)>W~$JF=4tR8US z?9px=0Af}x+<5)`?^?kL5xh@e!P&~N!Nb;p;*X{DV`vGaQ^vHZT^;foW={u=Y;9~L z{a-}O?vg&4Q!?=ShKZB>DPgJ;0LUZAtnO9vAM7B1#J6mLE}6>e6Q~yhBc^z8_Im=O zb3sh$vga3tRf?x<sSCWo{#^_qARxH#O*Y=d;lNlRpg4rg>ca|(-FGdAjR2vJ9s@+k zi<0i1@L0D%w5o8)jj*x5haS5C8nKE<D>Al~buhw+QfphBL`Se{Qi%ZSpp$64!$~BP z0s&TupGfw^!bz!-qjT#Wb+IDWg31Myjy}28ClNC25;r{t!~z1!snNhL$F>dB5ojM! zI)cxc)fGOTo81+k(T0ArPqm%Xx8B7`z-tu5)L%qP3BGMsFYpm3xS^rmyV<Xx*#Wcq zh<3cE<E~9;N1{lbzV$n1X7v!cBV1O}(Y>qnWoF=AoR&L0!k+@XKqaxm<@~5MGIF6) z(|t`YWwRP_Tnd$v4-gj;Mt)v&r3)Lh7la$17bla(wItV7kIF5Ir|6%G|L~;X5(U%w zQ~1F3rCIBYbsqn%^NUGuJi=VD5}B^M3LE=t_ZHXt0i9lgS1cK&Y+&kq5I!O_*6vz5 zh5ol;l*{Xfh@*{qC1e$MJn>X76gK?p2(!>>clLIHe7gn}r9I5$_StblNOZjLBq%(_ z4&wZAXbO;sU2-R^W&_u8)7OX?_tZOBJnU#V_;5IS&&Jq%TIbNSipSyxZ3WZ*_h=e( zfGx;s4CyWAhL}*zlwDY$M$XExzWpDNs4IyMJNsWTp>id0rxMlQU3HUt*jOz_F8DMB zT>S_Ohe~HZHVe3O&Vz}&k?zdw&hE@?hjULNF35t(iYF(~c9NaI?V(}B2biHoLfb}i zXRwsz?gMc-aqs3ivKQ28vzH{|IQ$Yi!}^0gQe3(|>dea8Tc#}{21t5VTuv}_?7P#I zj59wtwAI9kMQ%KbSX*zMVC_KilN7nRt4G%@oaN}aM;6OKjt-3Kp^FushyPF<0xuQi zzSa#ZTm#Z}Vd(4KwzUcrkw7=(39=4{B7>;ypGDFI0V3wmXNdOg7=Y;+fK9Ol<}A;l z-W^c$D5|v4yDmyx@k<*tR=dxkF0comYkab_1Boa{fI4hT2c{*?s5W?VL;2hp-~gx* ztf)c4akU)*x=6Ydcdpljr8D{>;nv6T;bdtaASX_M9G+7({T)02V&Nc<v*;FODuO}y z5Jf!e2qA@k5TA&>$8XYr;s!qe0S$NSn@@7>gx6@|BLhtsVGoqj(~!bx0W;#nL3ewm zXLx8{nxDCbY<&M3ttCJnI}bdtn7S1CMAw+^i;io&m#A8}%xYM!)IsKOFg&Fm+rNx% z1Q2rfi=3m>h`7h_LfITapv;ZIzWTl7fF$9?<EdpVzitpbcj14Lh+}jr;#N%|J{{SQ z&5B-la~@GclZ!M(<GXlB49yMJ7A|yAYYSLRQL9cku)WozEQAgOOoPRpo7L8On}Rrp zp%!IsorjAKHx;Z3LPcu<hEam!xV$9^+7CzpMZj+Ce>;p3+3J*$!(foY5TQ6L50S?W zG^^=Vm*72Ln9?(xoX#??_OQRghQG<=n@kQeVO*a^s8Aw_GAoEw^%B2RqfF(d3)oUR z0|7a$DuSfHO1uf9${vJF+QSQrA&;t1)C_;{TICSQj&PF{aF2P?0Tg2eND!+?lM1fL z0WCJ#F|vsVL_oqmg^s&0bwSj(IAP8T-VZJ+5+pG>Ie~Hx3X=q7k<jkviWfJCcnm>2 zP_0kj8WPHi=T9=ebZ(p;S(?4Y>FdznRIV}rR5q8_?b2!#G3%-ucY2+2N0}R2jJPcb ziWcIDm#yN;qK7kxG1r$MW4eZiHwsFO#VAMlW#sIC$m9hiVrM!X2O3bed1o0UAm^VD z?0x)hZvk4*_IBiD3j9~_5-S@pCmV-pb4Dy3S>-f&M5BQ@)Hp4K2=hlOgLfl?@@bek zT-H*G_A!P&g>HpMySKohlijq2bLPw%eCw0^{V@S<BSTasu1bgI!n3ZI&QTi?<c;B4 zBC5U1?m9#PBRJWL4e`#_>9#udnR!;W-3fQa<8C%0jovBMa)pJ+{x&sRReJfhT$Z7e zXjRAgPsnv+{rn-m`)wkUqcS~%nejFnIXYQGjDJxa04D>Agu9IUF3liPaN<^!@^?57 z4%*y<+1<<2JAta8BOYd!m7Z`rHyZQ3CHUIq@_$6P^Q<e8Uy*~)JiXg+j)oF&s$Q_) zLQmcIhb0sFZVCvM(&W%7GVcY5(``T~t5Odrygh#$2;%A@1O9o}fxx*D2s*0Y`(eTG zd>ah0Z7n`8>fL`bg3wk1jDOK}U=(6t$e_O8hQ(CzAl~SW6twU4f(nV$q)~2vjmg)U z{1TJzF!@y`pJeh4CSt39mpNf;|B<=hW%7GWXe8U;Mj~rdDaiiMEc_-D`TF;nqn2s^ zHzr?U@@q`K%!FLY{_jlw2a`Wy@;{NZIi%z^FGP@h{C@$j;VEQrh0fN(&|v>yq0ooF z0|WaC`S@>7p{KAPah%zKZ39~dwio&f`CMkOzfeFq>J<Mhn#bzee2Y<Ch+;*Nk>3hy zA7ZY;Dg#L3TbSj-e48{S4d>t?itm47CC$o>xuJa@3gq%uahLEe+|cH_7Y&uS7D~PN z>;!*J8SVkV?@s7LmG~)?FHg$F$@<&MqyUE&ag#FSA|vcbSLHeU0yq99FgwR@Qs8&| zW{WL+WUoR1_^o&NwQl-rEVw}JolGcGI)0%A^;P-B7vdArCMWc_UeE;5Uu1DVbNiS) zz=WpShF^W59;GP4uko9cfv(p4pjqV;wZd0hE`HGnbNJnHE!W<UoW!FpMm3xx#$l2* zXk>b^a8OwR=$oxb^?SH1Bb;;$ZHsLvbO2Bk+6R!eKg2```%&hGnb3c(zcGa_IQcaj z(0Q<H(SV;<FlWDn{{_H0;c<bm3@9$(1(W<GcSLnugpgUlo#0!<JP}*qVc;^LI7{d! z?Wp1_2$G80u;%Nx0=bHZvmck~BW5rT@C7XRKv*dhWXz#25Ps8ZlAPo>64-Kv;P+8a zE~A&xKd)ES$G;>*dc?26ifDV;*HKf3e^GwRqXrGnv$@ANq%Qs*9Vyp9a2z(n#l0}u zLb-<9j#zn_$tT!?q4sc;a6r7koY%DL&Asg_i)94KZJTm8mI91-qlI$omt4YTA7-Z? zWAYL9OtL0y<QgnNS{1+akc8dBRhj%9UlQ7F|0Pydur~wJ`lnDJ;q1}~_q5yJVhOp3 zd^lR<m4x=ES@>UANc=jjT5YYYucWtfWv+_3+f*)W3Rjy#MU+Tkf9+(`7@<u5wEoVy zXF22WyGVxM*}-2pJcnfWeTYxU7c)=f3h<U)K%kwL$lYRclUrfyo_t~Zz;I`afy_kq z<(`McuQn(>@Q$(}{C=H1dEN?F$PQ)qY~3@EgGq~c$$q`nY!|{zu-A`Xw}IKx6xk+U yL;QBOP}o+`+W3`a*}-gK>$dCqybI5o8%q9v_<^~&1U=&m=#AfD{}%qw=l(Y|tjcEq diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/database.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/database.py deleted file mode 100644 index eb6444a5e..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/database.py +++ /dev/null @@ -1,1301 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2013 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -"""PEP 376 implementation.""" - -from __future__ import unicode_literals - -import base64 -import codecs -import hashlib -import logging -import os -import sys -import zipimport - -from . import DistlibException -from .compat import StringIO, configparser, string_types -from .version import get_scheme, UnsupportedVersionError -from .markers import interpret -from .metadata import Metadata -from .util import (parse_requirement, cached_property, get_export_entry, - CSVReader, CSVWriter) - - -__all__ = ['Distribution', 'BaseInstalledDistribution', - 'InstalledDistribution', 'EggInfoDistribution', - 'DistributionPath'] - - -logger = logging.getLogger(__name__) - -DIST_FILES = ('INSTALLER', 'METADATA', 'RECORD', 'REQUESTED', 'RESOURCES', - 'EXPORTS', '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. - """ - for path in self.path: - realpath = os.path.realpath(path) - if not os.path.isdir(realpath): - continue - for dir in os.listdir(realpath): - dist_path = os.path.join(realpath, dir) - if self._include_dist and dir.endswith(DISTINFO_EXT): - yield new_dist_class(dist_path, env=self) - elif self._include_egg and dir.endswith(('.egg-info', - '.egg')): - yield old_dist_class(dist_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 not version is 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(): - provided = dist.provides - - for p in provided: - p_components = p.rsplit(' ', 1) - if len(p_components) == 1 or matcher is None: - if name == p_components[0]: - yield dist - break - else: - p_name, p_ver = p_components - if len(p_ver) < 2 or p_ver[0] != '(' or p_ver[-1] != ')': - raise DistlibException( - 'distribution %r has invalid Provides field: %r' % - (dist.name, p)) - p_ver = p_ver[1:-1] # trim off the parenthesis - 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.md5_digest = None - self.extras = None # additional features requested during installation - - @property - def download_url(self): - """ - The download URL for this distribution. - """ - return self.metadata.download_url - - @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-Dist'] - s = '%s (%s)' % (self.name, self.version) - if s not in plist: - plist.append(s) - return self.filter_requirements(plist) - - @property - def requires(self): - rlist = self.metadata['Requires-Dist'] - return self.filter_requirements(rlist) - - @property - def setup_requires(self): - rlist = self.metadata['Setup-Requires-Dist'] - return self.filter_requirements(rlist) - - @property - def test_requires(self): - rlist = self.metadata['Requires-Dist'] - return self.filter_requirements(rlist, extras=['test']) - - @property - def doc_requires(self): - rlist = self.metadata['Requires-Dist'] - return self.filter_requirements(rlist, extras=['doc']) - - def filter_requirements(self, rlist, context=None, extras=None): - result = set() - marked = [] - for req in rlist: - if ';' not in req: - result.add(req) - else: - marked.append(req.split(';', 1)) - if marked: - if context is None: - context = {} - if extras is None: - extras = self.extras - if not extras: - extras = [None] - else: - extras = list(extras) # leave original alone - extras.append(None) - for extra in extras: - context['extra'] = extra - for r, marker in marked: - if interpret(marker, context): - result.add(r.strip()) - return result - - 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. - """ - scheme = get_scheme(self.metadata.scheme) - 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 - - result = False - # Note this is similar to code in make_graph - to be refactored - for p in self.provides: - vm = scheme.matcher(p) - if vm.key != name: - continue - version = vm.exact_version - assert version - try: - result = matcher.match(version) - break - except UnsupportedVersionError: - pass - return result - - def __repr__(self): - """ - Return a textual representation of this instance, - """ - if self.download_url: - suffix = ' [%s]' % self.download_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 download_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.download_url == other.download_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.download_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 ``METADATA`` 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): - if env and env._cache_enabled and path in env._cache.path: - metadata = env._cache.path[path].metadata - elif metadata is None: - metadata_path = os.path.join(path, 'METADATA') - metadata = Metadata(path=metadata_path, scheme='legacy') - - super(InstalledDistribution, self).__init__(metadata, path, env) - - if env and env._cache_enabled: - env._cache.add(self) - - path = self.get_distinfo_file('REQUESTED') - self.requested = os.path.exists(path) - - 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 = [] - path = self.get_distinfo_file('RECORD') - with CSVReader(path) 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 list - of :class:`ExportEntry` instances describing the individual - export entries. - """ - result = {} - rf = self.get_distinfo_file('EXPORTS') - if os.path.exists(rf): - result = self.read_exports(rf) - return result - - def read_exports(self, filename=None): - """ - Read exports data from a file in .ini format. - :param filename: An absolute pathname of the file to read. If not - specified, the EXPORTS file in the .dist-info - directory of the distribution is read. - :return: A dictionary of exports, mapping an export category to a list - of :class:`ExportEntry` instances describing the individual - export entries. - """ - result = {} - rf = filename or self.get_distinfo_file('EXPORTS') - if os.path.exists(rf): - cp = configparser.ConfigParser() - cp.read(rf) - 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(self, exports, filename=None): - """ - 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. - :param filename: The absolute pathname of the file to write to. If not - specified, the EXPORTS file in the .dist-info - directory is written to. - """ - rf = filename or self.get_distinfo_file('EXPORTS') - 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) - with open(rf, 'w') as f: - cp.write(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. - """ - path = self.get_distinfo_file('RESOURCES') - with CSVReader(path) 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 = os.path.join(self.path, 'RECORD') - logger.info('creating %s', record_path) - if dry_run: - return - 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, '', '')) - - 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 = os.path.join(self.path, '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 - 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_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: string - :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' % - 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(req_path): - """Create a list of dependencies from a requires.txt file. - - *req_path* must be the path to a setuptools-produced requires.txt file. - """ - - reqs = [] - try: - with open(req_path, 'r') as fp: - lines = fp.read().splitlines() - except IOError: - return reqs - - 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 - - if path.endswith('.egg'): - if os.path.isdir(path): - meta_path = os.path.join(path, 'EGG-INFO', 'PKG-INFO') - metadata = Metadata(path=meta_path, scheme='legacy') - req_path = os.path.join(path, 'EGG-INFO', 'requires.txt') - requires = parse_requires(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: - requires = zipf.get_data('EGG-INFO/requires.txt') - except IOError: - requires = None - elif path.endswith('.egg-info'): - if os.path.isdir(path): - path = os.path.join(path, 'PKG-INFO') - req_path = os.path.join(path, 'requires.txt') - requires = parse_requires(req_path) - metadata = Metadata(path=path, scheme='legacy') - else: - raise DistlibException('path must end with .egg-info or .egg, ' - 'got %r' % path) - - if requires: - if metadata['Metadata-Version'] == '1.1': - # we can't have 1.1 metadata *and* Setuptools requires - for field in ('Obsoletes', 'Requires', 'Provides'): - if field in metadata: - del metadata[field] - metadata['Requires-Dist'] += requires - 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, hash, size 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, local=False): - """ - 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, local=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 local: If *local* is ``True``, each returned path is - transformed into a local absolute path. Otherwise the - raw value from ``installed-files.txt`` is returned. - :type local: boolean - :returns: iterator of paths - """ - record_path = os.path.join(self.path, 'installed-files.txt') - 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 local: - 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: - comps = p.strip().rsplit(" ", 1) - name = comps[0] - version = None - if len(comps) == 2: - version = comps[1] - if len(version) < 3 or version[0] != '(' or version[-1] != ')': - logger.warning('distribution %r has ill-formed ' - 'provides field: %r', dist.name, p) - continue - # don't raise an exception. Legacy installed distributions - # could have all manner of metadata - #raise DistlibException('distribution %r has ill-formed ' - # 'provides field: %r' % (dist.name, p)) - version = version[1:-1] # trim off parenthesis - # Add name in lower case for case-insensitivity - name = name.lower() - 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.requires | dist.setup_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. - """ - md = Metadata(**kwargs) - md['Name'] = name - md['Version'] = version - return Distribution(md) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/database.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/database.pyc deleted file mode 100644 index 80eeaad3fc5c5d4d2ee08bcf4d9eed14108492b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52143 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 Z&mQ>Q==_0S<lN|iADW(>JUn^m{{`>g4t)Rs diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/index.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/index.py deleted file mode 100644 index 282f6b745..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/index.py +++ /dev/null @@ -1,515 +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 itertools -import logging -import os -import shutil -import socket -from string import ascii_lowercase -import subprocess -import tempfile -from threading import Thread - -from distlib import DistlibException -from distlib.compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, - urlparse, build_opener) -from distlib.util import cached_property, zip_dir - -logger = logging.getLogger(__name__) - -DEFAULT_MIRROR_HOST = 'last.pypi.python.org' -DEFAULT_INDEX = 'http://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, mirror_host=None): - """ - Initialise an instance. - - :param url: The URL of the index. If not specified, the URL for PyPI is - used. - :param mirror_host: If not specified, ``last.pypi.python.org`` is used. - This is expected to have a canonial name which - allows all mirror hostnames to be divined (e.g. if - the canonical hostname for ``last.pypi.python.org`` - is ``g.pypi.python.org``, then the mirrors that are - available would be assumed to be - ``a.pypi.python.org``, ``b.pypi.python.org``, ... - up to and including ``g.pypi.python.org``. - """ - self.url = url or DEFAULT_INDEX - self.mirror_host = mirror_host or DEFAULT_MIRROR_HOST - 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: - for s in ('gpg2', 'gpg'): - 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 acutal 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() - missing, warnings = metadata.check(True) # strict check - logger.debug('result of check: missing: %s, warnings: %s', - missing, warnings) - d = metadata.todict(True) - 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): - """ - 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. - :return: The signing command as a list suitable to be - passed to :class:`subprocess.Popen`. - """ - cmd = [self.gpg, '--status-fd', '2', '--no-tty'] - if self.gpg_home: - cmd.extend(['--homedir', self.gpg_home]) - 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): - """ - 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. - :return: The absolute pathname of the file where the signature is - stored. - """ - cmd, sig_file = self.get_sign_command(filename, signer, sign_password) - 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'): - """ - 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``. - :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) - missing, warnings = metadata.check(True) # strict check - logger.debug('result of check: missing: %s, warnings: %s', - missing, warnings) - d = metadata.todict(True) - 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) - with open(filename, 'rb') as f: - file_data = f.read() - digest = hashlib.md5(file_data).hexdigest() - d.update({ - ':action': 'file_upload', - 'protcol_version': '1', - 'filetype': filetype, - 'pyversion': pyversion, - 'md5_digest': 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)) - logger.debug('files: %s', files) - 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) - missing, warnings = metadata.check(True) # strict check - logger.debug('result of check: missing: %s, warnings: %s', - missing, warnings) - 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): - """ - 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. - :return: The verifying command as a list suitable to be - passed to :class:`subprocess.Popen`. - """ - cmd = [self.gpg, '--status-fd', '2', '--no-tty'] - if self.gpg_home: - cmd.extend(['--homedir', self.gpg_home]) - cmd.extend(['--verify', signature_filename, data_filename]) - logger.debug('invoking: %s', ' '.join(cmd)) - return cmd - - def verify_signature(self, signature_filename, data_filename): - """ - 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. - :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) - 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 - else: - if isinstance(digest, (list, tuple)): - hasher, digest = digest - else: - hasher = 'md5' - digester = getattr(hashlib, hasher)() - # 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('MD5 digest mismatch for %s: expected ' - '%s, got %s' % (destfile, digest, - actual)) - - 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) - - @cached_property - def mirrors(self): - """ - Return the list of hostnames which are mirrors for this index. - :return: A (possibly empty) list of hostnames of mirrors. - """ - result = [] - try: - host = socket.gethostbyname_ex(self.mirror_host)[0] - except socket.gaierror: # pragma: no cover - host = None - if host: - last, rest = host.split('.', 1) - n = len(last) - host_list = (''.join(w) for w in itertools.chain.from_iterable( - itertools.product(ascii_lowercase, repeat=i) - for i in range(1, n + 1))) - for s in host_list: - result.append('.'.join((s, rest))) - if s == last: - break - return result diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/index.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/index.pyc deleted file mode 100644 index 8b8be972bda7e634f1f526cea2de8f290d7b4edd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21368 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 C7@zb2 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/locators.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/locators.py deleted file mode 100644 index 3dab8a2fc..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/locators.py +++ /dev/null @@ -1,1131 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2013 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 -import threading -import zlib - -from . import DistlibException -from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, - queue, quote, unescape, string_types, build_opener, - HTTPRedirectHandler as BaseRedirectHandler, - Request, HTTPError, URLError) -from .database import Distribution, DistributionPath, make_dist -from .metadata import Metadata -from .util import (cached_property, parse_credentials, ensure_slash, - split_filename, get_project_data, parse_requirement, - ServerProxy) -from .version import get_scheme, UnsupportedVersionError -from .wheel import Wheel, is_compatible - -logger = logging.getLogger(__name__) - -MD5_HASH = re.compile('^md5=([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 = 'http://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) - return client.list_packages() - -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: - 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()) - - 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. - """ - 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: - result = self._get_project(name) - elif name in self._cache: - result = self._cache[name] - else: - 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) - return (t.scheme != 'https', 'pypi.python.org' in t.netloc, - posixpath.basename(t.path)) - - 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 implement favours http:// URLs over https://, archives - from PyPI over those from other locations and then the archive name. - """ - if url1 == 'UNKNOWN': - result = url2 - else: - result = url2 - 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): - name1, name2 = name1.lower(), name2.lower() - if name1 == name2: - result = True - else: - # distribute replaces '-' by '_' in project names, so it - # can tell where the version starts in a filename. - result = name1.replace('_', '-') == name2.replace('_', '-') - return result - - result = None - scheme, netloc, path, params, query, frag = urlparse(url) - if frag.lower().startswith('egg='): - logger.debug('%s: version hint in fragment: %r', - project_name, frag) - origpath = path - if path and path[-1] == '/': - path = path[:-1] - if path.endswith('.whl'): - try: - wheel = Wheel(path) - if is_compatible(wheel, self.wheel_tags): - 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]), - } - m = MD5_HASH.match(frag) - if m: - result['md5_digest'] = m.group(1) - except Exception as e: - logger.warning('invalid path for wheel: %s', path) - elif path.endswith(self.downloadable_extensions): - 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: - 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: - result['python-version'] = pyver - m = MD5_HASH.match(frag) - if m: - result['md5_digest'] = m.group(1) - 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, whih 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.md5_digest = info.get('md5_digest') - if 'python-version' in info: - md['Requires-Python'] = info['python-version'] - if md['Download-URL'] != info['url']: - md['Download-URL'] = self.prefer_url(md['Download-URL'], - info['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 - scheme = get_scheme(self.scheme) - r = parse_requirement(requirement) - if r is None: - raise DistlibException('Not a valid requirement: %r' % requirement) - if r.extras: - # lose the extras part of the requirement - requirement = r.requirement - matcher = scheme.matcher(requirement) - vcls = matcher.version_class - logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) - versions = self.get_project(matcher.name) - if versions: - # sometimes, versions are invalid - slist = [] - for k in versions: - 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', k) - except Exception: - 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) - result = versions[slist[-1]] - if result and r.extras: - result.extras = r.extras - 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 = {} - 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.update(data) - dist = Distribution(metadata) - if urls: - info = urls[0] - metadata['Download-URL'] = info['url'] - dist.md5_digest = info.get('md5_digest') - dist.locator = self - result[v] = dist - return result - -class PyPIJSONLocator(Locator): - """ - This locator uses PyPI's JSON interface. It's very limited in functionality - nad 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 = {} - 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) - md.update(d['info']) - dist = Distribution(md) - urls = d['urls'] - if urls: - info = urls[0] - md['Download-URL'] = info['url'] - dist.md5_digest = info.get('md5_digest') - dist.locator = self - result[md.version] = dist - except Exception as 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() - - 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): - 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._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: - 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) - 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: - 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: - logger.exception('Fetch failed: %s: %s', url, e) - with self._lock: - self._bad_hosts.add(host) - except Exception as e: - 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): - 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 = {} - 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 = {} - data = get_project_data(name) - if data: - for info in data.get('files', []): - if info['ptype'] != 'sdist' or info['pyversion'] != 'source': - continue - dist = make_dist(data['name'], info['version'], - scheme=self.scheme) - md = dist.metadata - md['Download-URL'] = info['url'] - dist.md5_digest = info.get('digest') - md.dependencies = info.get('requirements', {}) - dist.exports = info.get('exports', {}) - result[dist.version] = dist - 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 = {} - else: - result = { dist.version: dist } - 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: - r = locator.get_project(name) - if r: - if self.merge: - result.update(r) - else: - result = r - 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 - - -default_locator = AggregatingLocator( - JSONLocator(), - SimpleScrapingLocator('https://pypi.python.org/simple/', - timeout=3.0)) - -locate = default_locator.locate - -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 _get_name_and_version(self, p): - """ - A utility method used to get name and version 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. - """ - comps = p.strip().rsplit(' ', 1) - name = comps[0] - version = None - if len(comps) == 2: - version = comps[1] - if len(version) < 3 or version[0] != '(' or version[-1] != ')': - raise DistlibException('Ill-formed provides field: %r' % p) - version = version[1:-1] # trim off parentheses - # Name in lower case for case-insensitivity - return name.lower(), version - - 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 = self._get_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 = self._get_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: - # 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, 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, tests=False, prereleases=False): - """ - Find a distribution matching requirement and all distributions - it depends on. Use the ``tests`` argument to determine whether - distributions used only for testing should be included in the - results. Allow ``requirement`` to be either a :class:`Distribution` - instance or a string expressing a requirement. If ``prereleases`` - is True, allow pre-release versions to be returned - otherwise, - don't. - - 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 = {} - - 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.requires - sreqts = dist.setup_requires - ereqts = set() - if not tests or dist not in install_dists: - treqts = set() - else: - treqts = dist.test_requires - all_reqts = ireqts | sreqts | treqts | 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 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/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/locators.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/locators.pyc deleted file mode 100644 index 81b549fc86bc168a6014cf92595b7cdc147c73bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45269 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 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/manifest.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/manifest.py deleted file mode 100644 index ae2c3ea60..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/manifest.py +++ /dev/null @@ -1,361 +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 - -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) - - -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: - if not self._exclude_pattern(pattern, anchor=True): - 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: - if not self._exclude_pattern(pattern, anchor=False): - 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: - if not self._exclude_pattern(pattern, prefix=thedir): - 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 pattern: - pattern_re = self._glob_to_re(pattern) - else: - pattern_re = '' - - base = re.escape(os.path.join(self.base, '')) - if prefix is not None: - # ditch end of pattern character - empty_pattern = self._glob_to_re('') - prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] - sep = os.sep - if os.sep == '\\': - sep = r'\\' - pattern_re = '^' + base + sep.join((prefix_re, - '.*' + pattern_re)) - else: # no prefix -- respect anchor flag - if anchor: - pattern_re = '^' + base + pattern_re - - 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/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/manifest.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/manifest.pyc deleted file mode 100644 index 130b52184259ff931953fea7abb3dd5e5992b647..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12454 zcmc&)%X1q?dhY>9kbp>&dRdm`#ADf7f+`ZSouoFAwUTL(_NrE*R70*+tAz{>FavU^ z!3;P(;3G@=5IMV>RIWZad)P}3smdkiq{_!sZEpDka!5`&<di*ZrE05^-|y?00jO7! zN|huLjYd!R*N^Y_J$uT(p00iUZzZRrvVUXv{um$qD-@nm4^UdlE2+>@4^T1nl6p|e z>t*$zoY%+HgE8gd=a>q|Rj;BRRFuWv<0_m`y-D?8()_Ndu&R1B^`M5|6KWI0Pbj~n zwx^Uotsdj&Ysw!}+cV0Wl*+7nj7d-Cjn%A?eNL%Q`0TU-A^(i(Vu>~Nl~RwD`q6{4 zT>D!61h+ImQM(zsTHA@=Pkil1X%KDN>6UMYfllqXYj=at*LD!uuI-^I3EG1+h@(cW zwz4w_cHIzT>@=2#coOOcM{x9ljjkBKkMTP0`F1~v+o9jnjau+u__rEZn7_^<okg*X zF=5bN+3)y$PGO!*;z?I~ekb;P(=vsYP8{v}N!seW=~l`vcibrG`a0F)_|a_cU9M@; ze7AA=M*YV3YV(IRe7!e+jIE!bgZ>2yA8f@Tp#&4B$-A#`;9y*d$M#^H9Au?JKC*&y zog@$0t*X3=G}d_De0qXBVnuidg6v#XUjZ0kBIuhI@B}S0BP}PSWmb7pGW?`+*6Ocu zkzb-%dV(eGK@g^P`@oJP+u!epagwu6SazUOzh}FVM-HZb;(O>@v+>XE_rnAB-F1^7 z9%vhfhz^k^8~3){)ZX(k2qS@m#Ba!;P6<okXAGa4_~;*@NR`^Q)OIPal+~f7`tQik zG2#ut#owV)t#Ovy<MODY&ar8NC(TM#r8V|u9fxNDpPWj2C}egn`&JaBfeT>y*cAY& zQ#a~hbw!7(eK&D?cH7ndReK!}W(~MZ{7xDt2i%=GC*K}Ko}ZYFk@RYvm`XWktW)k# za5aI7+tvlfqB!Zvj|v`a`e|p+lg^wcEu&2XxO@gt0_^44Y8?3jP&W*PFImSlB~YbB z_9~sVA9kH8+Uxk3LU&Q~t~NJ=bZgLV-VdUsunT66)Y?JRT=v_8&E~y>bSsWlqTS|) zjqf&Z2koW~Qh%}Ub{@H#zHat|eskB4yf|r6mLY7-UM4q<{(&sB)e3OVt=7AkR#UK4 zWzjlqRjm%?lwd3X@LT)<uc!)@>RIZ@QoWKoDyd#s9hH@}iN56Mm^vEEn12Kmj8nNC zRn%ccZCBLMgj6Qf(WKh{Yu1zBsKW`O0iCg=?J9==L`PM%|5zPX)$+risH2)ZtEuf1 ze0&J_VCoan2ppY|0aNO5iVE~-ny@?+HJbdRI)sXxP$?Rv8%SF_19e!+d!P;+OYf-! zKPIz|?1jJkJNMLmuMCXxBy<nOrxX@2n4$({C+HF-DhQ+u0wDIrMvj4v4T6zc7VwJ0 zLFyMECcYxK2P%c`?ZzND1gq%II^mWQplhvLYtG7NMSb~}Q`B#-{$N!Uh(TBCrp_r0 zaZa;1!(y5R5ht+h#|FR95I~8;{Ru5<bI6fH$O@_LIEdtlPFp=FW=AwR(cw_*K5G^k zm&CCFK7_aP$ay`d*B|ID5eV73bY)Et*&T!-e>i9J-kkB(NC*#{nh}ir5LJB<g&KRS zGz|ff|0R|)_<goKgW8n!x^><vbSIg1ljH8703^3X<w1i2gL;t)XuGVob74UTg4$A% z=>~ZLY)v0vQbrNHLw)(jAX^}5$pa<@kvZ53S$|4rLQC|F&dl-0F|Ow|phyF4cc5|G zKAeQmO@m!OCrEe?fw@{2Al10R)J;;o2c6~6(GVmFdYtq8$$riZ3PByFad@zz2L(R@ z0IunkaM^heiy?<Jb-AjXvMv}Fl6?gW$@={ZWW(~q)6{xUb>wG>%(QkUpd+l@j{OvU zpWw@J_bSr{FJ_QF&LJ_^8H?b#{cm|hNtGRn3Ngn`x#n?e=MrkK<j{?c^t=|%;NU)1 zp{adTW!fA)Il)!(`1N0+_!<5z)fJ~3$NOi%l2Sj1NQqdG9hOQq+4vZiq^$Pm$eQJc zZ_^n49DFM0q6Be+t0J;y?R;0=ry(e-yC4C%+XP*>f8qynJo}O3Z-{j=vItW)uKq%) zFG_0XOR!wl_=i|y!E(n>2T24cI7#7#86yFYdgz+O3H*_wyXXsUpOmPpHGq}lOBP_I z;&lOGMoC!s;^xchQCTHjDrvY{Ft2=Usiv4^oC3Dsjj2ZyN`Fqx{wEkEgwYOFV`0M{ zEJ~dxy(<1Q@YTXHsS2?2OB&~i6CsAK7;z<7oOu-WN!BPj;sS;7<|Z6;Qu64V7@6m$ zj1}Pn-4BB_rPWx{8lB<uuOvyFh+!2SfT^|2<{7`rO%QEJL(6zg)En6v1<G8GdWk-h zLo<LgQ<@&6vZk$BYsPxRI%WJNdXxeO_IL*cl*Gex)af`#<2f4+eQxa_DCF7mY*&qJ z7N_MbpwVoY6dUi$8OmN?_J%ce_q9zwf-9X|*Z85iq>8GO6%LsxntiD9#ZLeu#h_D; zjTnd}sPnhcL4?nq8`00u!fb@2gD`a(Xcvxm5hEDKyp<06VdepFa$$l{d6}I51I)aE zkETnd#!gMnSQVK3Y3q0JDI5NinOxybd^Am;(MR-(E$S9lM1^Gm&ztNU`Yr?x-ee~Z zL&Pq*%4lS;7@je`Hv!BL`!5?0BH<k_naKpBv`bS)X%i8YbJ_hG&LK0AMkgUGfLcPR zfC@Z#Ifh3im2}kpr4lso^23IN2_h(n3!sGI{5-ZS-Jst9HwjKS+Nrp98VY~+qkp$D z4F@`ZqxS#VI!*`EjMCZ7=}5cK*;PBcpz~Kkr=qx?U#tDEpP&P^Yv^EhtmoUDj>IxT z=UcV&E$B3b&ZN-!$lAa21f60%hEB!G_Jxoq+gHWfsaW@;GeV~(bbe~>j~hB496ujK zLNsKSUd`zs0D=iXBcidLRsP+NekDgeEu{X*+W$KmyXA)kDYK-4)HgY)*G5TwW9@tc zQeO(G86h=UB6AT9o>88JWL(JIQnsO4iQ&koyQSze8Fo^J-H>6hu+JQJYIN8vgFEju z2fq%R2HS-}Yjs8idKZFLn9qAj-0_jpax()<hjni&=xo_O98zD5S(cG9rnsBLy(goy zg4)K0blTWhu;T<Ca4+7?^I6A6XT6@zM?j%Lh_MLcz7;>|L?a`{rDk5X-iiky(lowF zw{?+jaMNNTOjH#AIx#a50n%wUz3gH34g0vWw0i5)m9_Oo5N&K2Z{zCF<1a|CvX!R& zt5>dgaYr)&faF0VPByPFIUu>bD>@z|9iP7&TWK$R7xThF^K`K)(e6Ri2?w4pY8y$J ztvJ!tWKo>?IugO!*i2`Od8bQ>jPmzo6vSD&B5AVAbX0h-n9<8!rKg5#s=&=KZo6UL zSO4A%Cq&BVV2{}>9xb<%=P^e~<qP`ke_GJUPHeNd=aN4OTHya6(Lg}HSP6;{@V)4W zvMhpu3)5GZ5`COlzTBn%`*KZ&VwAS%@y*2TrrI|2@}~jd{uBqKdp{XOzW)8^Pya#^ zvYQ}6201{W3JF0T^HP!pk<20>xtnO8?x&F-NfIMHC8%NMmq|-;6W5c0?_9<Z!PTCd zM1Yy;o*h!ro%ZNcH`KmEht0t!^ISM%O6O)cADt7kFo{mG8I5-WMS_mvlHfaE3@u(( ze<j{oN`z!eWq5E*3+Q_&)XatPDR?Jmtv6w#`CYY6K3yvf+s@=qORTZ~bpAaCABVmT z9XEPrVVMGTJ?@ycU_U9i|Nl@bvnRG~3l65U@?=RN5EiR?G>$1v`&<}{rV2*~gA z@D03EY7G9t7#sv<4AF2}Jwl4`Z$}89P>&#Df6kZ(d2{s1tOE$q!xF#Z?d6B3m}&%U znOn3ZR{NT+NA&kX_Kc7{$G9q6FDxX;{)>=>@f#&eDnj-=C}C;YG$+(Er}?c+vo6z| zm1%xFG7VObi0%6pS3mQjX(}p$1w=2{(qb{F!Mrm8T2b9GSVLyi^e@SgT+e?_`EpZ# z)Eo|THd)TR!2C08ln5vYj0{R7p1o=>+2V;aRcYj8p}0#}V0sf|7iffY=^L62x%vsP zPUU>W;(I7YRdFWeqfNQGJFW!tj>lWGzRq>hzJVejQuTW%E+xDLfJV{wwM<k$xL#C0 zylyudjiAilR4Ajpv5{fNr^ZNlH`3j;HIxwS^R<x!xGqX>5Iu_GJ>00}N>5^EP34hq zhxL5J&oFi)O?j{52awY_-kSHN5;VG=HBsZMCY$~LT7yKWPZ+5eF2oFY#%fGl$f#E` zguG*<GRCD3(gZ`z?U1V`@gQmEPdR|(_K;A~&S$7O-)C`)515G@;e}WZc6=q8+W8o( z`3HQ&eyYk8^2ExjmQI&y)@!9Q6zwSlk+Y@mK;4?!tTn8kF3*-a+$fbVzeV{{&m+KO zG-ZM&QD#O*JVulS4T^TrT#qJIa#eoHH669?{vTzJCGaxWGP$};mgSjbpp62xU=lIW z&NBb*Ljz?I?4KfOvF0;uwdrI<o7%4PW_i$a+u?!ugOcN)x5ew8<CT}(80$G`j1hNN zd@Oq|6VbT^=&v6}!TzF755(yWy^foBcAakEe6DszyzhJYr6zJlb`+;JZmXdMdFi5Y zn_#=R)b1gT&;z#QZd4x4bt9R0uF#*jY#4;_-RCaP$!+S~jXB%6vY;9*YN!(2O4^+* zTs|UJPxJzU4LX_^vqu*TQb?rtkwB+kzv%hAV!_;3ZH)`~E#BgCe;+aGkD~?Cie2OK zsExalyi-AJ`R>{k+y;8_p8iOB$vBd^<96)3Ya>T-t8330w|vgV8d7*mcAW>|`CS(| zmU&UuksLsF-q{Y(yB8<J+bP3RS@p%sh!`#+`aq(>@akeWj-`#){ycFuTxq)r8ymR5 z?G}q4T~3$Y7~U0#5yrrfU|mRN56M2U4|BCD`_KbiWCy;Ntv-%M@dfnZ3WCvw#7A@4 zxMBtMASLvGs%*#ea){u`$QT15U{7ek$4@1GK?u?I(>>ph3UXL=kKOXaz;;LX7;NJ1 z7%0O?kl=j^FHVZlWKf`6iNERZ7c5#BQXmNO9oWQkMo-{TP$^`EOvXDMgC1r?kcoIQ z4}3G31jeG&#YHcU$3;wwX&KzQ1*xp5y-hh@Tm(0P8aDz6#Z3o&5BJ(~@Y!%QZ4dCq z2m@1Gf_eohu6>}f5?3z<c=e-rV6+4t<a$C*4~sRqW-NTD8%Bm@xpcbxc96fG!ZVQ= zW$2`sK*Cv}PGp9zm2be$y%BTyDPh1x_M(N+NMv=kOa_zQg7XQA5exGJwq0XEYa(Gm z&NwkVvWPrU$@m0Jb>1cod|vvEzQfS)KkzX*%C{=k8@QI7E-^<v3;+LV6XK!si%rP> z4W{8}NZ_yYDg;?NV=Ul^if^4Xvd6fB$c+Uq`e7_gmQIWX;shnBeMd4X1qfbfEF{Nb z?1a%d1(*u#k09kPgffA6<E0RvidiIwYA@ISP{feC<MCvDo~EXaB+n2^>lh>Vb;qm~ z5D(iBbfJML*U;>E8^wMeJd2fPFfD$|{p!-aTNK*<pdAJsxq1!5c+d75n+<rY2zWK4 zV`#^<n|EwIXv2+xosq{dHbXUJ-t?eYo5aoWR7WwV$<<Rd97e$632}o4_iJpTFqmZ5 zi$%a$CzT(v_?!jry<QF0mof7Nz)E5UH3h8W@_hv7j8O|$slqsQOeOO~I|5e3eF#32 zi`k{1xs+MM*BU${d@*nZ<N<L>UIWY#GQbl3@kSnRs)%p2jeB`?!z*DzkKv&STaikx zs^niYB7BNR5F0~NBnkehk(LuS-i0AOyt#rmqojiPnBnucjFQoaMd2O~LEkyN55r02 zZ8QkhIoybX^f@l@9HZ3aKZ~At%4RTE?k&+9J=X*ang_R@X?PztL2vnCxEKbH#1tD> zD|Zc`ncYIqQ~eJ@cX)Zpdm*GWf!7gH%%p<Cmm3IUH^eO%HGXtX77CzZKs59LDI!2V zY!WPeK}VKj3|1WmAxP(#`ZY#nzMuqA7yD#F*W4W0bz>*t3z}i0hHrkT0USbFQ)e~h zx~tigE2%H!N8|Epoi{O}_5(zH=FK#TT(AtBHbqHNQ`w>=6lu|OZKW|Rgh-pOJ8s_} z-kXiQDj_zCZzMPbah-+S_&CSSkaLngBDh7*FwUOzp^EuQ4Jj3-39B*f6?<=Z7{ zo%boL-{JJt3gmRUG*PNpr%IL5JJwWb#(EPW5MQC0wa%dZWJz*OlwSlG*^Lq^kX~Fm zWI`zyL@-N892tmbNvHRjUP2?K1_={nPmuV5(u3Giitq=a!7!LLz8cF(^lwl+M<B?z z+-nqFoy!0d3(v)V4oLvF@VzJxf;fo5a?tJ4NHHubP@9J%jly|>eKKAoUejbq;>AeM z(%H^@@TcREVf;}yw;*(uia132cZ1Fd*fX5-oSXP3d5Pu+KmOv9ekguKy?*1`JI&^N zoloa4&o>(qt_#4k@JWDHtl3~%P}?NW$~@pfTMl{z#{yjTGPeUF4zDOU{{pL6Cq7?8 zMNQ010E^|SRYL}JwN7tRJik_pp=_%qg5TncaEKJ~lS!0T3zsUbmdRBx3**qol=mZ? zIo8Db@($U#%HlSQk6F;;6vxe>MH2(<a6Ln-Dz%q+)lG)|E<V~uQ7KnSQ!~{I)mpVW zb+$TQy<J_XSW|U;&fxQ|<RG0b^mN)N<TUs;2)q&l1Y$rGDz$*|G^iKxav~M1I3v7# zlH^WymbeYaxl*a&wcFeBYKhauFG>144>^ou?@0c;b@T4++e`P>R$BL#*4I~@Re83S z@`W=zyK`q{b$w;Ib^F%piYVS#!W@U2e066mfVyTNbe%$=-#~%$H2>kU<A1qYnkk>P H-YWk$nQQ|u diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/markers.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/markers.py deleted file mode 100644 index 182474008..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/markers.py +++ /dev/null @@ -1,189 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2013 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 345.""" - -import ast -import os -import sys -import platform - -from .compat import python_implementation, string_types -from .util import in_venv - -__all__ = ['interpret'] - -class Evaluator(object): - """ - A limited evaluator for Python expressions. - """ - - operators = { - 'eq': lambda x, y: x == y, - 'gt': lambda x, y: x > y, - 'gte': lambda x, y: x >= y, - 'in': lambda x, y: x in y, - 'lt': lambda x, y: x < y, - 'lte': lambda x, y: x <= y, - 'not': lambda x: not x, - 'noteq': lambda x, y: x != y, - 'notin': lambda x, y: x not in y, - } - - allowed_values = { - 'sys.platform': sys.platform, - 'python_version': '%s.%s' % sys.version_info[:2], - # parsing sys.platform is not reliable, but there is no other - # way to get e.g. 2.7.2+, and the PEP is defined with sys.version - 'python_full_version': sys.version.split(' ', 1)[0], - 'os.name': os.name, - 'platform.in_venv': str(in_venv()), - 'platform.version': platform.version(), - 'platform.machine': platform.machine(), - 'platform.python_implementation': platform.python_implementation(), - } - - def __init__(self, context=None): - """ - Initialise an instance. - - :param context: If specified, names are looked up in this mapping. - """ - self.context = context or {} - self.source = None - - def get_fragment(self, offset): - """ - Get the part of the source which is causing a problem. - """ - fragment_len = 10 - s = '%r' % (self.source[offset:offset + fragment_len]) - if offset + fragment_len < len(self.source): - s += '...' - return s - - def get_handler(self, node_type): - """ - Get a handler for the specified AST node type. - """ - return getattr(self, 'do_%s' % node_type, None) - - def evaluate(self, node, filename=None): - """ - Evaluate a source string or node, using ``filename`` when - displaying errors. - """ - if isinstance(node, string_types): - self.source = node - kwargs = {'mode': 'eval'} - if filename: - kwargs['filename'] = filename - try: - node = ast.parse(node, **kwargs) - except SyntaxError as e: - s = self.get_fragment(e.offset) - raise SyntaxError('syntax error %s' % s) - node_type = node.__class__.__name__.lower() - handler = self.get_handler(node_type) - if handler is None: - if self.source is None: - s = '(source not available)' - else: - s = self.get_fragment(node.col_offset) - raise SyntaxError("don't know how to evaluate %r %s" % ( - node_type, s)) - return handler(node) - - def get_attr_key(self, node): - assert isinstance(node, ast.Attribute), 'attribute node expected' - return '%s.%s' % (node.value.id, node.attr) - - def do_attribute(self, node): - valid = True - if not isinstance(node.value, ast.Name): - valid = False - else: - key = self.get_attr_key(node) - valid = key in self.context or key in self.allowed_values - if not valid: - raise SyntaxError('invalid expression: %s' % key) - if key in self.context: - result = self.context[key] - else: - result = self.allowed_values[key] - return result - - def do_boolop(self, node): - result = self.evaluate(node.values[0]) - is_or = node.op.__class__ is ast.Or - is_and = node.op.__class__ is ast.And - assert is_or or is_and - if (is_and and result) or (is_or and not result): - for n in node.values[1:]: - result = self.evaluate(n) - if (is_or and result) or (is_and and not result): - break - return result - - def do_compare(self, node): - def sanity_check(lhsnode, rhsnode): - valid = True - if isinstance(lhsnode, ast.Str) and isinstance(rhsnode, ast.Str): - valid = False - elif (isinstance(lhsnode, ast.Attribute) - and isinstance(rhsnode, ast.Attribute)): - klhs = self.get_attr_key(lhsnode) - krhs = self.get_attr_key(rhsnode) - valid = klhs != krhs - if not valid: - s = self.get_fragment(node.col_offset) - raise SyntaxError('Invalid comparison: %s' % s) - - lhsnode = node.left - lhs = self.evaluate(lhsnode) - result = True - for op, rhsnode in zip(node.ops, node.comparators): - sanity_check(lhsnode, rhsnode) - op = op.__class__.__name__.lower() - if op not in self.operators: - raise SyntaxError('unsupported operation: %r' % op) - rhs = self.evaluate(rhsnode) - result = self.operators[op](lhs, rhs) - if not result: - break - lhs = rhs - lhsnode = rhsnode - return result - - def do_expression(self, node): - return self.evaluate(node.body) - - def do_name(self, node): - valid = False - if node.id in self.context: - valid = True - result = self.context[node.id] - elif node.id in self.allowed_values: - valid = True - result = self.allowed_values[node.id] - if not valid: - raise SyntaxError('invalid expression: %s' % node.id) - return result - - def do_str(self, node): - return node.s - - -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 - """ - return Evaluator(execution_context).evaluate(marker.strip()) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/markers.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/markers.pyc deleted file mode 100644 index f7fbb22b52f708ef6cf31ae5dee9575bbaae5cfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9174 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 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/metadata.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/metadata.py deleted file mode 100644 index 51dbe853f..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/metadata.py +++ /dev/null @@ -1,708 +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 logging -import re - - -from . import DistlibException -from .compat import StringIO, string_types -from .markers import interpret -from .version import get_scheme - -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.""" - - -try: - # docutils is installed - from docutils.utils import Reporter - from docutils.parsers.rst import Parser - from docutils import frontend - from docutils import nodes - - class SilentReporter(Reporter, object): - - def __init__(self, source, report_level, halt_level, stream=None, - debug=0, encoding='ascii', error_handler='replace'): - self.messages = [] - super(SilentReporter, self).__init__( - source, report_level, halt_level, stream, - debug, encoding, error_handler) - - def system_message(self, level, message, *children, **kwargs): - self.messages.append((level, message, children, kwargs)) - return nodes.system_message(message, level=level, type=self. - levels[level], *children, **kwargs) - - _HAS_DOCUTILS = True -except ImportError: - # docutils is not installed - _HAS_DOCUTILS = False - -# 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 = 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') - -_ALL_FIELDS = set() -_ALL_FIELDS.update(_241_FIELDS) -_ALL_FIELDS.update(_314_FIELDS) -_ALL_FIELDS.update(_345_FIELDS) -_ALL_FIELDS.update(_426_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 == '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', '2.0'] - - # 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') - if key not in _314_FIELDS and '1.1' in possible_versions: - possible_versions.remove('1.1') - if key not in _345_FIELDS and '1.2' in possible_versions: - possible_versions.remove('1.2') - if key not in _426_FIELDS and '2.0' in possible_versions: - possible_versions.remove('2.0') - - # possible_version contains qualified versions - if len(possible_versions) == 1: - return possible_versions[0] # found ! - elif len(possible_versions) == 0: - 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_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) - if int(is_1_1) + int(is_1_2) + int(is_2_0) > 1: - raise MetadataConflictError('You used incompatible 1.1/1.2/2.0 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_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' - - 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.]+') - - -class Metadata(object): - """The 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 that execution_context and platform_dependent are used - # to filter on query, not when setting a key - # also document the mapping API and UNKNOWN default key - - def __init__(self, path=None, platform_dependent=False, - execution_context=None, fileobj=None, mapping=None, - scheme='default'): - self._fields = {} - self.requires_files = [] - self.docutils_support = _HAS_DOCUTILS - self.platform_dependent = platform_dependent - self.execution_context = execution_context - self._dependencies = None - self.scheme = scheme - if [path, fileobj, mapping].count(None) < 2: - raise TypeError('path, fileobj and mapping are exclusive') - 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, file, name, value): - file.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 _check_rst_data(self, data): - """Return warnings when the provided data has syntax errors.""" - source_path = StringIO() - parser = Parser() - settings = frontend.OptionParser().get_default_values() - settings.tab_width = 4 - settings.pep_references = None - settings.rfc_references = None - reporter = SilentReporter(source_path, - settings.report_level, - settings.halt_level, - stream=settings.warning_stream, - debug=settings.debug, - encoding=settings.error_encoding, - error_handler=settings.error_encoding_error_handler) - - document = nodes.document(settings, reporter, source=source_path) - document.note_source(source_path, -1) - try: - parser.parse(data, document) - except AttributeError: - reporter.messages.append((-1, 'Could not finish the parsing.', - '', {})) - - return reporter.messages - - def _platform(self, value): - if not self.platform_dependent or ';' not in value: - return True, value - value, marker = value.split(';') - return interpret(marker, self.execution_context), value - - def _remove_line_prefix(self, value): - return _LINE_PREFIX.sub('\n', value) - - def __getattr__(self, name): - if name in _ATTR2FIELD: - return self[name] - raise AttributeError(name) - - def _get_dependencies(self): - def handle_req(req, rlist, extras): - if ';' not in req: - rlist.append(req) - else: - r, marker = req.split(';') - m = EXTRA_RE.search(marker) - if m: - extra = m.groups()[0][1:-1] - extras.setdefault(extra, []).append(r) - - result = self._dependencies - if result is None: - self._dependencies = result = {} - extras = {} - setup_reqs = self['Setup-Requires-Dist'] - if setup_reqs: - result['setup'] = setup_reqs - install_reqs = [] - for req in self['Requires-Dist']: - handle_req(req, install_reqs, extras) - if install_reqs: - result['install'] = install_reqs - if extras: - result['extras'] = extras - return result - - def _set_dependencies(self, value): - if 'test' in value: - value = dict(value) # don't change value passed in - value.setdefault('extras', {})['test'] = value.pop('test') - self._dependencies = value - setup_reqs = value.get('setup', []) - install_reqs = value.get('install', []) - klist = [] - for k, rlist in value.get('extras', {}).items(): - klist.append(k) - for r in rlist: - install_reqs.append('%s; extra == "%s"' % (r, k)) - if setup_reqs: - self['Setup-Requires-Dist'] = setup_reqs - if install_reqs: - self['Requires-Dist'] = install_reqs - if klist: - self['Provides-Extra'] = klist - # - # 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.""" - name, version = self['Name'], self['Version'] - if filesafe: - # 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) - - 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'] - - for field in _version2fieldlist(self['Metadata-Version']): - 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) - 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': - 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( - '%r: %r is not valid (field %r)', - 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('%r: %r is not a valid version (field %r)', - project_name, value, name) - elif name in _VERSION_FIELDS and value is not None: - if not scheme.is_valid_version(value): - logger.warning('%r: %r is not a valid version (field %r)', - 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: - valid, val = self._platform(val) - if not valid: - continue - 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: - valid, value = self._platform(self._fields[name]) - if not valid: - return [] - if isinstance(value, string_types): - return value.split(',') - valid, value = self._platform(self._fields[name]) - if not valid: - return None - return value - - def check(self, strict=False, restructuredtext=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) - - if _HAS_DOCUTILS and restructuredtext: - warnings.extend(self._check_rst_data(self['Description'])) - - # 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 %r: %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'), - ('classifier', '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'), - ) - 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'), - ) - if not skip_missing or field_name in self._fields: - data[key] = self[field_name] - - return data - - # 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 '<Metadata %s %s>' % (self.name, self.version) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/metadata.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/metadata.pyc deleted file mode 100644 index 6f5806f407d152c36f4196e1386a7110343070c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27613 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 J?aK^h{|{(`qjUfO diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/resources.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/resources.py deleted file mode 100644 index 5f2d212b1..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/resources.py +++ /dev/null @@ -1,304 +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. -# -from __future__ import unicode_literals - -import bisect -import io -import logging -import os -import shutil -import sys -import zipimport - -from . import DistlibException -from .util import cached_property, get_cache_base, path_to_cache_dir - -logger = logging.getLogger(__name__) - -class Cache(object): - """ - A class implementing a cache for resources that need to live in the file system - e.g. shared libraries. - """ - - def __init__(self, base=None): - """ - Initialise an instance. - - :param base: The base directory where the cache should be located. If - not specified, this will be the ``resource-cache`` - directory under whatever :func:`get_cache_base` returns. - """ - if base is None: - base = os.path.join(get_cache_base(), 'resource-cache') - # 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): - os.makedirs(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 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 - - 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 - -cache = Cache() - -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. Not a property, as not idempotent." - return self.finder.get_stream(self) - - @cached_property - def file_path(self): - 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. - """ - def __init__(self, module): - self.module = module - self.loader = getattr(module, '__loader__', None) - self.base = os.path.dirname(getattr(module, '__file__', '')) - - def _make_path(self, resource_name): - parts = resource_name.split('/') - parts.insert(0, self.base) - return os.path.join(*parts) - - 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(('.pyc', '.pyo')) - 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) - -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 _find(self, path): - path = path[self.prefix_len:] - if path in self._files: - result = True - else: - if 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[-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[-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: - import _frozen_importlib - _finder_registry[_frozen_importlib.SourceFileLoader] = ResourceFinder -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 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/resources.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/resources.pyc deleted file mode 100644 index 8de9112f6f11c6bc2b6fca7a6507984826bba195..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14530 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 Qb$oRe*lyHX^=9pV0feF@SO5S3 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/scripts.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/scripts.py deleted file mode 100644 index be923f61b..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/scripts.py +++ /dev/null @@ -1,253 +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 logging -import os -import re -import struct -import sys - -from . import DistlibException -from .compat import sysconfig, fsencode, detect_encoding -from .resources import finder -from .util import FileOperator, get_export_entry, convert_path, get_executable - -logger = logging.getLogger(__name__) - -# check if Python is called on the first line with this expression -FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') -SCRIPT_TEMPLATE = '''%(shebang)s -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('-script.pyw?$', '', 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) -''' - - -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.set_mode = False - self._fileop = fileop or FileOperator(dry_run) - - def _get_alternate_executable(self, executable, flags): - if 'gui' in flags and os.name == 'nt': - dn, fn = os.path.split(executable) - fn = fn.replace('python', 'pythonw') - executable = os.path.join(dn, fn) - return executable - - def _get_shebang(self, encoding, post_interp=b'', flags=None): - if self.executable: - executable = self.executable - elif not sysconfig.is_python_build(): - executable = get_executable() - elif hasattr(sys, 'base_prefix') and sys.prefix != sys.base_prefix: - executable = os.path.join( - sysconfig.get_path('scripts'), - 'python%s' % sysconfig.get_config_var('EXE')) - else: - executable = os.path.join( - sysconfig.get_config_var('BINDIR'), - 'python%s%s' % (sysconfig.get_config_var('VERSION'), - sysconfig.get_config_var('EXE'))) - if flags: - executable = self._get_alternate_executable(executable, flags) - - executable = fsencode(executable) - shebang = b'#!' + executable + post_interp + b'\n' - # 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: - 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: - raise ValueError( - 'The shebang (%r) is not decodable ' - 'from the script encoding (%r)' % (shebang, encoding)) - return shebang - - def _get_script_text(self, shebang, entry): - return self.script_template % dict(shebang=shebang, - module=entry.prefix, - func=entry.suffix) - - def _make_script(self, entry, filenames): - shebang = self._get_shebang('utf-8', flags=entry.flags).decode('utf-8') - script = self._get_script_text(shebang, entry) - outname = os.path.join(self.target_dir, entry.name) - use_launcher = self.add_launchers and os.name == 'nt' - if use_launcher: - exename = '%s.exe' % outname - if 'gui' in entry.flags: - ext = 'pyw' - launcher = self._get_launcher('w') - else: - ext = 'py' - launcher = self._get_launcher('t') - outname = '%s-script.%s' % (outname, ext) - self._fileop.write_text_file(outname, script, 'utf-8') - if self.set_mode: - self._fileop.set_executable_mode([outname]) - filenames.append(outname) - if use_launcher: - self._fileop.write_binary_file(exename, launcher) - filenames.append(exename) - - def _copy_script(self, script, filenames): - adjust = False - script = convert_path(script) - outname = os.path.join(self.target_dir, os.path.basename(script)) - filenames.append(outname) - script = os.path.join(self.source_dir, 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: - if not self.dry_run: - raise - f = None - else: - encoding, lines = detect_encoding(f.readline) - f.seek(0) - first_line = f.readline() - if not first_line: - 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) - else: - logger.info('copying and adjusting %s -> %s', script, - self.target_dir) - if not self._fileop.dry_run: - shebang = self._get_shebang(encoding, post_interp) - use_launcher = self.add_launchers and os.name == 'nt' - if use_launcher: - n, e = os.path.splitext(outname) - exename = n + '.exe' - if b'pythonw' in first_line: - launcher = self._get_launcher('w') - suffix = '-script.pyw' - else: - launcher = self._get_launcher('t') - suffix = '-script.py' - outname = n + suffix - filenames[-1] = outname - self._fileop.write_binary_file(outname, shebang + f.read()) - if use_launcher: - self._fileop.write_binary_file(exename, launcher) - filenames.append(exename) - if f: - f.close() - if self.set_mode: - self._fileop.set_executable_mode([outname]) - - @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': - # 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) - result = finder('distlib').find(name).bytes - return result - - # Public API follows - - def make(self, specification): - """ - 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). - :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) - return filenames - - def make_multiple(self, specifications): - """ - 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)) - return filenames diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/scripts.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/scripts.pyc deleted file mode 100644 index 8a05456a7c2b3d011ff2aac359e73864ff4468ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8838 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 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/util.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/util.py deleted file mode 100644 index f44e8c352..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/util.py +++ /dev/null @@ -1,1313 +0,0 @@ -# -# Copyright (C) 2012-2013 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 shutil -import socket -import ssl -import sys -import tarfile -import tempfile -import time -import zipfile - -from . import DistlibException -from .compat import (string_types, text_type, shutil, raw_input, - cache_from_source, urlopen, httplib, xmlrpclib, splittype, - HTTPHandler, HTTPSHandler as BaseHTTPSHandler, - URLError, match_hostname, CertificateError) - -logger = logging.getLogger(__name__) - -class Container(object): - """ - A generic container for when multiple values need to be returned - """ - def __init__(self, **kwargs): - self.__dict__.update(kwargs) - -# -# Requirement parsing code for name + optional constraints + optional extras -# -# e.g. 'foo >= 1.2, < 2.0 [bar, baz]' -# -# The regex can seem a bit hairy, so we build it up out of smaller pieces -# which are manageable. -# - -COMMA = r'\s*,\s*' -COMMA_RE = re.compile(COMMA) - -IDENT = r'(\w|[.-])+' -RELOP = '([<>=!]=)|[<>]' - -# -# The first relop is optional - if absent, will be taken as '==' -# -BARE_CONSTRAINTS = ('(' + RELOP + r')?\s*(' + IDENT + ')(' + COMMA + '(' + - RELOP + r')\s*(' + IDENT + '))*') - -# -# Either the bare constraints or the bare constraints in parentheses -# -CONSTRAINTS = (r'\(\s*(?P<c1>' + BARE_CONSTRAINTS + r')\s*\)|(?P<c2>' + - BARE_CONSTRAINTS + '\s*)') - -EXTRA_LIST = IDENT + '(' + COMMA + IDENT + ')*' -EXTRAS = r'\[\s*(?P<ex>' + EXTRA_LIST + r')?\s*\]' -REQUIREMENT = ('(?P<dn>' + IDENT + r')\s*(' + EXTRAS + r'\s*)?(\s*' + - CONSTRAINTS + ')?$') -REQUIREMENT_RE = re.compile(REQUIREMENT) - -# -# Used to scan through the constraints -# -RELOP_IDENT = '(?P<op>' + RELOP + r')\s*(?P<vn>' + IDENT + ')' -RELOP_IDENT_RE = re.compile(RELOP_IDENT) - -def parse_requirement(s): - - def get_constraint(m): - d = m.groupdict() - return d['op'], d['vn'] - - result = None - m = REQUIREMENT_RE.match(s) - if m: - d = m.groupdict() - name = d['dn'] - cons = d['c1'] or d['c2'] - if not cons: - cons = None - constr = '' - rs = d['dn'] - else: - if cons[0] not in '<>!=': - cons = '==' + cons - iterator = RELOP_IDENT_RE.finditer(cons) - cons = [get_constraint(m) for m in iterator] - rs = '%s (%s)' % (name, ', '.join(['%s %s' % con for con in cons])) - if not d['ex']: - extras = None - else: - extras = COMMA_RE.split(d['ex']) - result = Container(name=name, constraints=cons, extras=extras, - requirement=rs, source=s) - return result - - -def get_resources_dests(resources_root, rules): - """Find destinations for resources files""" - - def get_rel_path(base, path): - # normalizes and returns a lstripped-/-separated path - base = base.replace(os.path.sep, '/') - path = path.replace(os.path.sep, '/') - assert path.startswith(base) - return path[len(base):].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(): - if sys.platform == 'darwin' and ('__VENV_LAUNCHER__' - in os.environ): - result = os.environ['__VENV_LAUNCHER__'] - else: - result = sys.executable - 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 - -@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, type=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): - """Copy a file respecting dry-run and force flags. - """ - assert not os.path.isdir(outfile) - self.ensure_dir(os.path.dirname(outfile)) - logger.info('Copying %s to %s', infile, outfile) - if not self.dry_run: - shutil.copyfile(infile, outfile) - if self.record: - self.files_written.add(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() - if self.record: - self.files_written.add(outfile) - - def write_binary_file(self, path, data): - self.ensure_dir(os.path.dirname(path)) - if not self.dry_run: - with open(path, 'wb') as f: - f.write(data) - if self.record: - self.files_written.add(path) - - def write_text_file(self, path, data, encoding): - self.ensure_dir(os.path.dirname(path)) - if not self.dry_run: - with open(path, 'wb') as f: - f.write(data.encode(encoding)) - if self.record: - self.files_written.add(path) - - def set_mode(self, bits, mask, files): - if 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): - 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):] - py_compile.compile(path, dpath, diagpath, True) # raise on error - if self.record: - self.files_written.add(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): - 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 ' - '%r' % 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 ' - '%r' % specification) - prefix, suffix = path.split(':') - flags = d['flags'] - if flags is None: - if '[' in specification or ']' in specification: - raise DistlibException('Invalid specification ' - '%r' % 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('~') - result = os.path.join(result, suffix) - # we use 'isdir' instead of 'exists', because we want to - # fail if there's a file with that name - if not os.path.isdir(result): - os.makedirs(result) - return result - - -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_]*)*)-' - '([0-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 - 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 - -# -# 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() - if headers.get('Content-Type') != 'application/json': - logger.debug('Unexpected response for JSON request') - 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 - - -def get_project_data(name): - url = ('https://www.red-dove.com/pypi/projects/' - '%s/%s/project.json' % (name[0].upper(), name)) - result = _get_external_data(url) - return result - -def get_package_data(dist): - name, version = dist.name, dist.version - url = ('https://www.red-dove.com/pypi/projects/' - '%s/%s/package-%s.json' % (name[0].upper(), name, version)) - result = _get_external_data(url) - if 'metadata' in result and dist.metadata: - update_metadata(dist.metadata, result) - return result - -RENAMES = { # Temporary - 'classifiers': 'Classifier', - 'use_2to3': None, - 'use_2to3_fixers': None, - 'test_suite': None, -} - -def update_metadata(metadata, pkginfo): - # update dist's metadata from received package data - assert metadata - assert 'metadata' in pkginfo - for k, v in pkginfo['metadata'].items(): - k = k.replace('-', '_') - k = RENAMES.get(k, k) - if k is not None: - metadata[k] = v - metadata.set_metadata_version() - if 'requirements' in pkginfo: - metadata.dependencies = pkginfo['requirements'] - - -# -# Simple event pub/sub -# - -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): - self._nodes.remove(node) - - 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: - raise ValueError('%r not a successor of anything' % succ) - try: - preds.remove(pred) - succs.remove(succ) - except KeyError: - 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: - raise ValueError('Unknown format for %r' % archive_filename) - try: - if format == 'zip': - archive = zipfile.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.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 file in _iglob(os.path.join(path, radical)): - yield file - - - -# -# 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: - 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) - except CertificateError: - 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)) - - - 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 - -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'] = '' - 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, fn, **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(fn, '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) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/util.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/util.pyc deleted file mode 100644 index f4d2b82d7be75c89b9012f5d9a2fa2ccad82acfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51522 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 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/version.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/version.py deleted file mode 100644 index 1e45e3118..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/version.py +++ /dev/null @@ -1,719 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2012-2013 The Python Software Foundation. -# See LICENSE.txt and CONTRIBUTORS.txt. -# -""" -Implementation of a flexible versioning scheme providing support for PEP-386, -distribute-compatible and semantic versioning. -""" - -import re - -from .compat import string_types - -__all__ = ['NormalizedVersion', 'NormalizedMatcher', - 'LegacyVersion', 'LegacyMatcher', - 'SemanticVersion', 'SemanticMatcher', - 'AdaptiveVersion', 'AdaptiveMatcher', - 'UnsupportedVersionError', 'HugeMajorVersionError', - 'suggest_normalized_version', 'suggest_semantic_version', - 'suggest_adaptive_version', - 'normalized_key', 'legacy_key', 'semantic_key', 'adaptive_key', - 'get_scheme'] - -class UnsupportedVersionError(Exception): - """This is an unsupported version.""" - pass - - -class HugeMajorVersionError(UnsupportedVersionError): - """An irrational version because the major version number is huge - (often because a year or date was used). - - See `error_on_huge_major_num` option in `NormalizedVersion` for details. - This guard can be disabled by setting that option False. - """ - pass - - -class _Common(object): - def __repr__(self): - return "%s(%r)" % (self.__class__.__name__, self._string) - - def __str__(self): - return self._string - - -class Version(_Common): - 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) - - @property - def is_prerelease(self): - raise NotImplementedError('Please implement in subclasses.') - -class Matcher(_Common): - version_class = None - - predicate_re = re.compile(r"^(\w[\s\w'.-]*)(\((.*)\))?") - constraint_re = re.compile(r'^(<=|>=|<|>|!=|==)?\s*([^\s,]+)$') - - _operators = { - "<": lambda x, y: x < y, - ">": lambda x, y: x > y, - "<=": lambda x, y: x == y or x < y, - ">=": lambda x, y: x == y or x > y, - "==": lambda x, y: x == y, - "!=": lambda x, y: x != y, - } - - def __init__(self, s): - if self.version_class is None: - raise ValueError('Please specify a version class') - self._string = s = s.strip() - m = self.predicate_re.match(s) - if not m: - raise ValueError('Not valid: %r' % s) - groups = m.groups('') - self.name = groups[0].strip() - self.key = self.name.lower() # for case-insensitive comparisons - clist = [] - if groups[2]: - constraints = [c.strip() for c in groups[2].split(',')] - for c in constraints: - m = self.constraint_re.match(c) - if not m: - raise ValueError('Invalid %r in %r' % (c, s)) - groups = m.groups('==') - clist.append((groups[0], self.version_class(groups[1]))) - self._parts = tuple(clist) - - def match(self, version): - """Check if the provided version matches the constraints.""" - if isinstance(version, string_types): - version = self.version_class(version) - for operator, constraint in self._parts: - if not self._operators[operator](version, constraint): - return False - return True - - @property - def exact_version(self): - result = None - if len(self._parts) == 1 and self._parts[0][0] == '==': - 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) - -# A marker used in the second and third parts of the `parts` tuple, for -# versions that don't have those segments, to sort properly. An example -# of versions in sort order ('highest' last): -# 1.0b1 ((1,0), ('b',1), ('z',)) -# 1.0.dev345 ((1,0), ('z',), ('dev', 345)) -# 1.0 ((1,0), ('z',), ('z',)) -# 1.0.post256.dev345 ((1,0), ('z',), ('z', 'post', 256, 'dev', 345)) -# 1.0.post345 ((1,0), ('z',), ('z', 'post', 345, 'z')) -# ^ ^ ^ -# 'b' < 'z' ---------------------/ | | -# | | -# 'dev' < 'z' ----------------------------/ | -# | -# 'dev' < 'z' ----------------------------------------------/ -# 'f' for 'final' would be kind of nice, but due to bugs in the support of -# 'rc' we must use 'z' -_FINAL_MARKER = ('z',) - -_VERSION_RE = re.compile(r''' - ^ - (?P<version>\d+\.\d+(\.\d+)*) # minimum 'N.N' - (?: - (?P<prerel>[abc]|rc) # 'a'=alpha, 'b'=beta, 'c'=release candidate - # 'rc'= alias for release candidate - (?P<prerelversion>\d+(?:\.\d+)*) - )? - (?P<postdev>(\.post(?P<post>\d+))?(\.dev(?P<dev>\d+))?)? - $''', re.VERBOSE) - - -def _parse_numdots(s, full_ver, drop_zeroes=False, min_length=0): - """Parse 'N.N.N' sequences, return a list of ints. - - @param s {str} 'N.N.N...' sequence to be parsed - @param full_ver_str {str} The full version string from which this - comes. Used for error strings. - @param min_length {int} The length to which to pad the - returned list with zeros, if necessary. Default 0. - """ - result = [] - for n in s.split("."): - #if len(n) > 1 and n[0] == '0': - # raise UnsupportedVersionError("cannot have leading zero in " - # "version number segment: '%s' in %r" % (n, full_ver)) - result.append(int(n)) - if drop_zeroes: - while (result and result[-1] == 0 and - (1 + len(result)) > min_length): - result.pop() - return result - -def pep386_key(s, fail_on_huge_major_ver=True): - """Parses a string version into parts using PEP-386 logic.""" - - match = _VERSION_RE.search(s) - if not match: - raise UnsupportedVersionError(s) - - groups = match.groupdict() - parts = [] - - # main version - block = _parse_numdots(groups['version'], s, min_length=2) - parts.append(tuple(block)) - - # prerelease - prerel = groups.get('prerel') - if prerel is not None: - block = [prerel] - block += _parse_numdots(groups.get('prerelversion'), s, min_length=1) - parts.append(tuple(block)) - else: - parts.append(_FINAL_MARKER) - - # postdev - if groups.get('postdev'): - post = groups.get('post') - dev = groups.get('dev') - postdev = [] - if post is not None: - postdev.extend((_FINAL_MARKER[0], 'post', int(post))) - if dev is None: - postdev.append(_FINAL_MARKER[0]) - if dev is not None: - postdev.extend(('dev', int(dev))) - parts.append(tuple(postdev)) - else: - parts.append(_FINAL_MARKER) - if fail_on_huge_major_ver and parts[0][0] > 1980: - raise HugeMajorVersionError("huge major version number, %r, " - "which might cause future problems: %r" % (parts[0][0], s)) - return tuple(parts) - - -PEP426_VERSION_RE = re.compile('^(\d+\.\d+(\.\d+)*)((a|b|c|rc)(\d+))?' - '(\.(post)(\d+))?(\.(dev)(\d+))?$') - -def pep426_key(s, _=None): - s = s.strip() - m = PEP426_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[0].split('.')) - while len(nums) > 1 and nums[-1] == 0: - nums = nums[:-1] - - pre = groups[3:5] - post = groups[6:8] - dev = groups[9:11] - 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 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 nums, pre, post, dev - - -normalized_key = pep426_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 # mininum two numbers - 1.2a # release level must have a release serial - 1.2.3b - """ - def parse(self, s): return normalized_key(s) - - 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) - -class UnlimitedMajorVersion(Version): - def parse(self, s): return normalized_key(s, False) - -# We want '2.5' to match '2.5.4' but not '2.50'. - -def _match_at_front(x, y): - if x == y: - return True - x = str(x) - y = str(y) - if not x.startswith(y): - return False - n = len(y) - return x[n] == '.' - -class NormalizedMatcher(Matcher): - version_class = NormalizedVersion - - _operators = dict(Matcher._operators) - _operators.update({ - "<=": lambda x, y: _match_at_front(x, y) or x < y, - ">=": lambda x, y: _match_at_front(x, y) or x > y, - "==": lambda x, y: _match_at_front(x, y), - "!=": lambda x, y: not _match_at_front(x, y), - }) - -_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 pobably 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 - -def suggest_adaptive_version(s): - return suggest_normalized_version(s) or suggest_semantic_version(s) - -# -# 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) - - PREREL_TAGS = set( - ['*a', '*alpha', '*b', '*beta', '*c', '*rc', '*r', '*@', '*pre'] - ) - - @property - def is_prerelease(self): - return any(x in self.PREREL_TAGS for x in self._parts) - -class LegacyMatcher(Matcher): - version_class = LegacyVersion - -# -# 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 - - result = None - 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 - -# -# Adaptive versioning. When handed a legacy version string, tries to -# determine a suggested normalized version, and work with that. -# - -def adaptive_key(s): - try: - result = normalized_key(s, False) - except UnsupportedVersionError: - ss = suggest_normalized_version(s) - if ss is not None: - result = normalized_key(ss) # "guaranteed" to work - else: - ss = s # suggest_semantic_version(s) or s - result = semantic_key(ss) # let's hope ... - return result - - -class AdaptiveVersion(NormalizedVersion): - def parse(self, s): return adaptive_key(s) - - @property - def is_prerelease(self): - try: - normalized_key(self._string) - not_sem = True - except UnsupportedVersionError: - ss = suggest_normalized_version(self._string) - not_sem = ss is not None - if not_sem: - return any(t[0] in self.PREREL_TAGS for t in self._parts) - return self._parts[1][0] != '|' - -class AdaptiveMatcher(NormalizedMatcher): - version_class = AdaptiveVersion - - -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), - 'adaptive': VersionScheme(adaptive_key, AdaptiveMatcher, - suggest_adaptive_version), -} - -_SCHEMES['default'] = _SCHEMES['adaptive'] - -def get_scheme(name): - if name not in _SCHEMES: - raise ValueError('unknown scheme name: %r' % name) - return _SCHEMES[name] diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/version.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/version.pyc deleted file mode 100644 index 368cf690f9e7b45cdf165a8bef380d1d3c66b292..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29953 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%0D{44Qq?a)QI^9H3NyU%i84F>D;KJ5Br(CwNtr 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 Lu;}d0@5%ii&`pAd diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/wheel.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/wheel.py deleted file mode 100644 index 8274732ad..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/wheel.py +++ /dev/null @@ -1,638 +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. -# -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 DistlibException -from .compat import sysconfig, ZipFile, fsdecode, text_type, filter -from .database import DistributionPath, InstalledDistribution -from .metadata import Metadata -from .scripts import ScriptMaker -from .util import (FileOperator, convert_path, CSVReader, CSVWriter, - cached_property, get_cache_base) - - -logger = logging.getLogger(__name__) - - -if hasattr(sys, 'pypy_version_info'): - IMP_PREFIX = 'pp' -elif sys.platform.startswith('java'): - IMP_PREFIX = 'jy' -elif sys.platform == 'cli': - 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: - ABI = 'none' - -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+) -\.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]*') - -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 - result.__package__, _ = fullname.rsplit('.', 1) - return result - -_hook = Mounter() - - -class Wheel(object): - """ - Class to build and install from Wheel files (PEP 427). - """ - - wheel_version = (1, 0) - hash_kind = 'sha256' - - def __init__(self, filename=None, sign=False, verify=False): - """ - Initialise an instance using a (valid) filename. - """ - self.sign = sign - self.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'] - self.version = info['vn'] - 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) - return '%s-%s%s-%s-%s-%s.whl' % (self.name, self.version, buildver, - pyver, abi, arch) - - @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 - metadata_filename = posixpath.join(info_dir, 'METADATA') - wrapper = codecs.getreader('utf-8') - with ZipFile(pathname, 'r') as zf: - with zf.open(metadata_filename) as bf: - wf = wrapper(bf) - result = Metadata() - result.read_file(wf) - return result - - @cached_property - def info(self): - pathname = os.path.join(self.dirname, self.filename) - name_ver = '%s-%s' % (self.name, self.version) - info_dir = '%s.dist-info' % name_ver - metadata_filename = posixpath.join(info_dir, 'WHEEL') - wrapper = codecs.getreader('utf-8') - with ZipFile(pathname, 'r') as zf: - with zf.open(metadata_filename) as bf: - wf = wrapper(bf) - message = message_from_file(wf) - result = dict(message) - return result - - def process_shebang(self, data): - m = SHEBANG_RE.match(data) - if m: - data = b'#!python' + data[m.end():] - 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 = b'#!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): - with CSVWriter(record_path) as writer: - for row in records: - writer.writerow(row) - p = to_posix(os.path.relpath(record_path, base)) - writer.writerow((p, '', '')) - - def build(self, paths, tags=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'): - p = fsdecode(os.path.join(distinfo, fn)) - ap = to_posix(os.path.join(info_dir, fn)) - archive_paths.append((ap, p)) - - import distlib - - wheel_metadata = [ - 'Wheel-Version: %d.%d' % self.wheel_version, - 'Generator: distlib %s' % distlib.__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. - records = [] - 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)) - # Now, ready to build the zip file - pathname = os.path.join(self.dirname, self.filename) - 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) - return pathname - - def install(self, paths, dry_run=False, executable=None, warner=None): - """ - Install a wheel to the specified paths. If ``executable`` is specified, - it should be the Unicode absolute path the to the executable written - into the shebang lines of any scripts installed. If ``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. - """ - 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 - - 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(record_name, stream=bf) as reader: - for row in reader: - p = row[0] - records[p] = row - - data_pfx = posixpath.join(data_dir, '') - script_pfx = posixpath.join(data_dir, 'scripts', '') - - 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 = ScriptMaker(workdir, None, fileop=fileop, - add_launchers=False) - maker.executable = executable - try: - for zinfo in zf.infolist(): - arcname = zinfo.filename - if isinstance(arcname, text_type): - u_arcname = arcname - else: - u_arcname = arcname.decode('utf-8') - 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) - - 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) - 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) - - 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) - outfiles.append(p) - - # Write RECORD - dist.write_installed_files(outfiles, paths['prefix'], - dry_run) - return dist - except Exception as e: # pragma: no cover - logger.exception('installation failed.') - fileop.rollback() - raise - finally: - shutil.rmtree(workdir) - - def _get_dylib_cache(self): - result = os.path.join(get_cache_base(), 'dylib-cache') - if not os.path.isdir(result): - os.makedirs(result) - return result - - 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_base = self._get_dylib_cache() - 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 mount(self, append=False): - pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) - if not is_compatible(self): - msg = 'Wheel %s not mountable in this Python.' % 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 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 = [] - - # Most specific - our Python version, ABI and arch - for abi in abis: - 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 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/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/wheel.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/distlib/wheel.pyc deleted file mode 100644 index 03017eb06bf10b6e1b54f121afa47b72a46d3cb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21389 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 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/__init__.py deleted file mode 100644 index 10e2b74c2..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -""" -HTML parsing library based on the WHATWG "HTML5" -specification. 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: - -import html5lib -f = open("my_document.html") -tree = html5lib.parse(f) -""" - -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"] -__version__ = "1.0b1" diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/__init__.pyc deleted file mode 100644 index aceb365fcf9abc498370ba79eee14af1f107edd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1135 zcmZWo&2Abo5FQo+WCKZh&%xqE4na+&s8ZEdP1UqHBvrIULRzilda+roc-Jf23!zWZ zOW(2gzCg#jkTwcP!_0VQzHfeL{~3nAeh1MUwx2Hke)t}M{fP<(h*7qH2cTMz2M`C4 zw;^sr-hsFSE#3y+0ksEt7ve7DJ&1dd_aW{#Z+oEjArB!A8@mhY0P+FEgU0TG8bW>u z@gdrM;QPQs;0M45z=x1w(Iepad<^^uzKxHORCU_|2(PENH>707$|565riPgfNtqR# z=z_SVAhYYs>Ff&``N)e=XiG7d3pr;_>S98s7~#`}A<_~qtjr3`b(*At%ynL3T&e_F zOSdHAL0X4E4eCNy1t+pWSxdzU^LAb;k&D7vvKC66aj}rTqA*4qV#Hjp1X6TM=0ZeN z%w$4so<ZfB3sZPP_fD5sDkZ7WYvgGsVR-exJPfHU%fy>7L{M!US-M<Z;1I$Ec}H|9 zit#AlP_E~dCp7WTqtnnCA@F?{JgM6sFHS@0cRy~Ua7QRuYPG7IpiOnxM<16fX>o9_ z-asMeNRuk*gkj1`T*x**M9mNUt{$!1L$ii)!=3iou*|a>`y_XWA`@<k)IL@?N?{tm z58wJ{Ox^F?`{>3|NT%cuQ9T8#9>J<-VAXS+I_L>R^|ZP#cRqQUo_`&`K-Kk7P(M^k zokym0QMt+pN+Yx&^8G{s3U`2_o^o?wk)LeT@xs@1123@Qv}xEz{y$eIdGESz*G3+$ z#(C`5M1B)n9!x3Z;gKlC!}7bKbc`na6E;JWzezH@;VMmLvba<WBlv$>DvRV3GRcy= zja%yCs#qnjCa;qlnI;z3dsedfJ>Hs4N?9f=QE+XN-329-%0fCyC*`KTlDBxhl@jlL Uht^+8H#iASTF3qy3|fQMUxLswp#T5? diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/constants.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/constants.py deleted file mode 100644 index 1866dd78e..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/constants.py +++ /dev/null @@ -1,3086 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import string -import gettext -_ = gettext.gettext - -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."), - "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"], "annotaion-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") -)) - -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",)), - "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")), -} - -# 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", - 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", -} - -encodings = { - '437': 'cp437', - '850': 'cp850', - '852': 'cp852', - '855': 'cp855', - '857': 'cp857', - '860': 'cp860', - '861': 'cp861', - '862': 'cp862', - '863': 'cp863', - '865': 'cp865', - '866': 'cp866', - '869': 'cp869', - 'ansix341968': 'ascii', - 'ansix341986': 'ascii', - 'arabic': 'iso8859-6', - 'ascii': 'ascii', - 'asmo708': 'iso8859-6', - 'big5': 'big5', - 'big5hkscs': 'big5hkscs', - 'chinese': 'gbk', - 'cp037': 'cp037', - 'cp1026': 'cp1026', - 'cp154': 'ptcp154', - 'cp367': 'ascii', - 'cp424': 'cp424', - 'cp437': 'cp437', - 'cp500': 'cp500', - 'cp775': 'cp775', - 'cp819': 'windows-1252', - 'cp850': 'cp850', - 'cp852': 'cp852', - 'cp855': 'cp855', - 'cp857': 'cp857', - 'cp860': 'cp860', - 'cp861': 'cp861', - 'cp862': 'cp862', - 'cp863': 'cp863', - 'cp864': 'cp864', - 'cp865': 'cp865', - 'cp866': 'cp866', - 'cp869': 'cp869', - 'cp936': 'gbk', - 'cpgr': 'cp869', - 'cpis': 'cp861', - 'csascii': 'ascii', - 'csbig5': 'big5', - 'cseuckr': 'cp949', - 'cseucpkdfmtjapanese': 'euc_jp', - 'csgb2312': 'gbk', - 'cshproman8': 'hp-roman8', - 'csibm037': 'cp037', - 'csibm1026': 'cp1026', - 'csibm424': 'cp424', - 'csibm500': 'cp500', - 'csibm855': 'cp855', - 'csibm857': 'cp857', - 'csibm860': 'cp860', - 'csibm861': 'cp861', - 'csibm863': 'cp863', - 'csibm864': 'cp864', - 'csibm865': 'cp865', - 'csibm866': 'cp866', - 'csibm869': 'cp869', - 'csiso2022jp': 'iso2022_jp', - 'csiso2022jp2': 'iso2022_jp_2', - 'csiso2022kr': 'iso2022_kr', - 'csiso58gb231280': 'gbk', - 'csisolatin1': 'windows-1252', - 'csisolatin2': 'iso8859-2', - 'csisolatin3': 'iso8859-3', - 'csisolatin4': 'iso8859-4', - 'csisolatin5': 'windows-1254', - 'csisolatin6': 'iso8859-10', - 'csisolatinarabic': 'iso8859-6', - 'csisolatincyrillic': 'iso8859-5', - 'csisolatingreek': 'iso8859-7', - 'csisolatinhebrew': 'iso8859-8', - 'cskoi8r': 'koi8-r', - 'csksc56011987': 'cp949', - 'cspc775baltic': 'cp775', - 'cspc850multilingual': 'cp850', - 'cspc862latinhebrew': 'cp862', - 'cspc8codepage437': 'cp437', - 'cspcp852': 'cp852', - 'csptcp154': 'ptcp154', - 'csshiftjis': 'shift_jis', - 'csunicode11utf7': 'utf-7', - 'cyrillic': 'iso8859-5', - 'cyrillicasian': 'ptcp154', - 'ebcdiccpbe': 'cp500', - 'ebcdiccpca': 'cp037', - 'ebcdiccpch': 'cp500', - 'ebcdiccphe': 'cp424', - 'ebcdiccpnl': 'cp037', - 'ebcdiccpus': 'cp037', - 'ebcdiccpwt': 'cp037', - 'ecma114': 'iso8859-6', - 'ecma118': 'iso8859-7', - 'elot928': 'iso8859-7', - 'eucjp': 'euc_jp', - 'euckr': 'cp949', - 'extendedunixcodepackedformatforjapanese': 'euc_jp', - 'gb18030': 'gb18030', - 'gb2312': 'gbk', - 'gb231280': 'gbk', - 'gbk': 'gbk', - 'greek': 'iso8859-7', - 'greek8': 'iso8859-7', - 'hebrew': 'iso8859-8', - 'hproman8': 'hp-roman8', - 'hzgb2312': 'hz', - 'ibm037': 'cp037', - 'ibm1026': 'cp1026', - 'ibm367': 'ascii', - 'ibm424': 'cp424', - 'ibm437': 'cp437', - 'ibm500': 'cp500', - 'ibm775': 'cp775', - 'ibm819': 'windows-1252', - 'ibm850': 'cp850', - 'ibm852': 'cp852', - 'ibm855': 'cp855', - 'ibm857': 'cp857', - 'ibm860': 'cp860', - 'ibm861': 'cp861', - 'ibm862': 'cp862', - 'ibm863': 'cp863', - 'ibm864': 'cp864', - 'ibm865': 'cp865', - 'ibm866': 'cp866', - 'ibm869': 'cp869', - 'iso2022jp': 'iso2022_jp', - 'iso2022jp2': 'iso2022_jp_2', - 'iso2022kr': 'iso2022_kr', - 'iso646irv1991': 'ascii', - 'iso646us': 'ascii', - 'iso88591': 'windows-1252', - 'iso885910': 'iso8859-10', - 'iso8859101992': 'iso8859-10', - 'iso885911987': 'windows-1252', - 'iso885913': 'iso8859-13', - 'iso885914': 'iso8859-14', - 'iso8859141998': 'iso8859-14', - 'iso885915': 'iso8859-15', - 'iso885916': 'iso8859-16', - 'iso8859162001': 'iso8859-16', - 'iso88592': 'iso8859-2', - 'iso885921987': 'iso8859-2', - 'iso88593': 'iso8859-3', - 'iso885931988': 'iso8859-3', - 'iso88594': 'iso8859-4', - 'iso885941988': 'iso8859-4', - 'iso88595': 'iso8859-5', - 'iso885951988': 'iso8859-5', - 'iso88596': 'iso8859-6', - 'iso885961987': 'iso8859-6', - 'iso88597': 'iso8859-7', - 'iso885971987': 'iso8859-7', - 'iso88598': 'iso8859-8', - 'iso885981988': 'iso8859-8', - 'iso88599': 'windows-1254', - 'iso885991989': 'windows-1254', - 'isoceltic': 'iso8859-14', - 'isoir100': 'windows-1252', - 'isoir101': 'iso8859-2', - 'isoir109': 'iso8859-3', - 'isoir110': 'iso8859-4', - 'isoir126': 'iso8859-7', - 'isoir127': 'iso8859-6', - 'isoir138': 'iso8859-8', - 'isoir144': 'iso8859-5', - 'isoir148': 'windows-1254', - 'isoir149': 'cp949', - 'isoir157': 'iso8859-10', - 'isoir199': 'iso8859-14', - 'isoir226': 'iso8859-16', - 'isoir58': 'gbk', - 'isoir6': 'ascii', - 'koi8r': 'koi8-r', - 'koi8u': 'koi8-u', - 'korean': 'cp949', - 'ksc5601': 'cp949', - 'ksc56011987': 'cp949', - 'ksc56011989': 'cp949', - 'l1': 'windows-1252', - 'l10': 'iso8859-16', - 'l2': 'iso8859-2', - 'l3': 'iso8859-3', - 'l4': 'iso8859-4', - 'l5': 'windows-1254', - 'l6': 'iso8859-10', - 'l8': 'iso8859-14', - 'latin1': 'windows-1252', - 'latin10': 'iso8859-16', - 'latin2': 'iso8859-2', - 'latin3': 'iso8859-3', - 'latin4': 'iso8859-4', - 'latin5': 'windows-1254', - 'latin6': 'iso8859-10', - 'latin8': 'iso8859-14', - 'latin9': 'iso8859-15', - 'ms936': 'gbk', - 'mskanji': 'shift_jis', - 'pt154': 'ptcp154', - 'ptcp154': 'ptcp154', - 'r8': 'hp-roman8', - 'roman8': 'hp-roman8', - 'shiftjis': 'shift_jis', - 'tis620': 'cp874', - 'unicode11utf7': 'utf-7', - 'us': 'ascii', - 'usascii': 'ascii', - 'utf16': 'utf-16', - 'utf16be': 'utf-16-be', - 'utf16le': 'utf-16-le', - 'utf8': 'utf-8', - 'windows1250': 'cp1250', - 'windows1251': 'cp1251', - 'windows1252': 'cp1252', - 'windows1253': 'cp1253', - 'windows1254': 'cp1254', - 'windows1255': 'cp1255', - 'windows1256': 'cp1256', - 'windows1257': 'cp1257', - 'windows1258': 'cp1258', - 'windows936': 'gbk', - 'x-x-big5': 'big5'} - -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): - pass - - -class ReparseException(Exception): - pass diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/constants.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/constants.pyc deleted file mode 100644 index c22d9cb6e2277b2a9fb5bbbb865d4182424d2131..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86306 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 F{2wI~GX4Mn diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/__init__.pyc deleted file mode 100644 index ddca85ddefd254cb6da92d8a1ed87ce0a6d193b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198 zcmZSn%*!?P1yfKm0~9a<X$K%KW&si@3=F{<AQ3+eAi;n}6z7AKSjD7gmSmJB#e`?( zIp(AlrKTXUk}~sRTvC%t(_;cEOEU8FT=U9ejP%T7d@_?_iZe@6bqf-cvlG)(i(?8h z3u4Mr^HTDQVlql{b4+u9D$+7@N>Yo8W8&j8^D;}~<Mj$EOE`db+T`Y^l;)(`fm~J$ G#0&t$O*M@G diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/_base.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/_base.py deleted file mode 100644 index c7dbaed0f..000000000 --- a/PythonEnv/2.7/Lib/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/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/_base.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/_base.pyc deleted file mode 100644 index a3e8b13d83129a2865d0cdd899591e646facc51a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1301 zcmd5*&2H2%5FW?d(iT<l0Nl9bLJvrQgb?EYgesIhR9#szN$l*pI8GE#R;tw7_7(b$ z+<5_Jyy;S2fD*-%nTcooeKTYE>-gyAXI9iOJ(9lfzGo0$l49r;-~n0z3ju8giws%` z3kkwxU}w+>FcPi-HUQ^~Juowv=X(_DIA6}$@DYi!ik%<PYS;GNfOtSY<JK;^F5qJ_ z#^CDCSnVC!q4W{=$@#^3vUb=6xjrzqr=(b5NQ96MCsc%!6$ylkl^GQCbbOuB=G*m= zqmRjPCEyA`CyMi&6Q3rTj*Z<o)HdfJoRNsuHw7y>t*wYu6fm#V(&1{X)R_zKeKS~d zN2^>=pKLWQ)wfGrb>VYZtLG=L)K^!jNGzZAW&NXE+NgThtF;ZL8`KJ0|H9LbCQ*+{ zS7o#({bj0{)-E{InhP8m9*CN;^I~&H4~Zebg@BEqer)OO=x~L%bofWX$^HXk1WIcj zi(6uhmlw}aBF1B~BSsC}WPfveK>wE(OT>vDM<;rzi=k}oee!%rXtbUHYR%?EHC>pg z!HiOCJW89}&WxVSf-ghC#VI)K4~wMz^I0soCFx=?u6=PR59Mjj`h>d~aU2*oxu8f> e#=S_FtE(<-jVZ-_^GGFsvn}#lMw$BYME(ZqIYGn# diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/alphabeticalattributes.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/alphabeticalattributes.py deleted file mode 100644 index fed6996c1..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/alphabeticalattributes.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from . import _base - -try: - from collections import OrderedDict -except ImportError: - from ordereddict import OrderedDict - - -class Filter(_base.Filter): - 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=lambda x: x[0]): - attrs[name] = value - token["data"] = attrs - yield token diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/alphabeticalattributes.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/alphabeticalattributes.pyc deleted file mode 100644 index 595e1a577bc1256c3219b3ce8b4c20107a51228a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1547 zcmd5+O=}cE5PdzfyGd4~5kny0#oJ!YL6CripppoJM45=uWy07q-J5i_XJ#|q6S9y+ zMDZW^AHDkrtm<7qE}qSP^j6ipu6^~Yy5k?K{cqo+q`>0UrQatXBDhavDEbIkpcEJi zlo5sz${52KLPbz9YzJi*!!E>hJ-|D#J(NorE<qes_tDYI828Z>5JGT10<8Q3R08i* z7rKkHK1KqnhcCcq;Qg=<wS>dLGO;jBZ4lGqZ_^@kSKHR>%#@S5@tz^dTo`BS%CC{r zR;H+x&aCmek=7YO!2vIxtIKlf^xVBc?yE-WMyowjc;6%cxv{kEw;sIh8S8O}3=Nin zsvwr6L~<C?6pZ1_{4E&!m5j@e@W7eCS%fPpN?`AJjG4d{Wf0h;^2R+hQ}~!Go<+Fa zhVO*O9c-R;IZEOzG!bI&cmrvKS&SK>=tFs9?3^b!Vw19Vuv3Apx8nRRj)>=6z=O6! zg#2`(TNdlk%f`QvC&Ae-Cw|HfLzMKA=m29q4OMYv5pUtDcrR7L<PQfNJ(zcftcAP` zzZ?Xg7dN9tJx))IKW+2$$W%}5h_wF8%1xE->AXEjUr+sMUF}yF>BFt<^rgvDNBw&+ zk;Pb^XqQgRB)!m;s+;uGm-dk*#3=O2rP5ALWv;y`q?O(`Ca3vuTa#%RjvXt@T*+PT zpkrQv{J*6b@E9a4L&6;mIkJq0Da(?eBm*4Ho>pO^=uzng0n3k_wxbaD^;lQIVp5Kp z3skbyA#@>atFMz*$qLcC$^7{cL2QaOu_89;eM_v0`T64!$TF@W%X~jLWvyCEZrJ{( zo?!j|0SF!BWA1ohd*Wcg&Vu@=^=-q{DTIWFH(?YV+eQC9gNxc)U3j`(+`Ri7d=c)R p{idNQV85Q<B8qO2@R!$4i1|sFH*1$mb=>NE(OMLXb?WbW{1fXkc7*@{ diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/inject_meta_charset.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/inject_meta_charset.py deleted file mode 100644 index ca33b70b5..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/inject_meta_charset.py +++ /dev/null @@ -1,65 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from . import _base - - -class Filter(_base.Filter): - def __init__(self, source, encoding): - _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/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/inject_meta_charset.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/inject_meta_charset.pyc deleted file mode 100644 index 15d473760151ad1d2eb9591d86f34e83701dea01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2406 zcmd5;QE%f!5T0EpZqsY8?Ufb|4s;Si%1eucM3LY?aI_~Oq3V>L+N1JeoOqKsb!^98 zhZZHgls8^@LE;baWB3mz@ya`|Jn+rf;R@(@<tp2mo&9!p=9}5sI=`>2{P>&h^r-%G z@cZ#snu^aLgm@IiL}Nu~ipHAGG>siPb4Z1nLWkl8jhl4V#JEAGNh6o~iozy+M|4H> z#hFW?OULacSc`azHg90p@d>&`8kg4i(Kt(UYnP!5qiIw`X<|1pD3hp{hQ^O0Yw{p2 zA_ZleKemaF-wg_5T}Th27>K_@V8ne6;Z+ER*mDE|hu}QIVZou!aa&`$$L=iNPkGT@ zC@j%P(MZ#bXr|~&lbXrEci7aiIC0c&0NUZj9hM{j-;a{W`o0WI0{^3AP{quc!o+=X zxk$^rXFBYC8*lX~zJV0J?+qe5EW6%mlzbBRa}!>Zx>4dCm~J`n9$wmEnj9um@14E( zyw9VqSAeJ8Ea;sF15<celzCH=glX;#?Kpln2BI%S6<(B#OwambV*|f8407<emtA(4 zRZdjFu9DhPJ*IL6FKc_u&QBl>9L^O}GlEQXzD#pX1ERS@7gKFDjT{;^7;vTN;7M1{ zF=!A9=JvcvvnJQgxu!f8ZG&!)np`U=8rG&71q1t&R40yR^pfa*RczxKdReqzD$qH1 z>EckPTQIi7#txo*OP=OuzC?3)*rM5zc-x}<7n=Oc&up3Mtyjd@A9YZ?5iDT=5PePe zkWGa6uv!w{5HOav7Ry&_4ddL}`0320{HY3WNt7^mUX5?oo9xuPgj);ylcx$n|2@hD zCn&#FP!pm4@MzixTOeb9VWdU-CyHkgB+o9(EKW?Frk9|rFgOG2*Dai=D!R#@Q2v7? zXk7w&t}_m&X@)GfDBR#IpYZu8?u&oV@nC!5K|*x#3So8b{lmuOP@h)Lgqw>JkOPQ{ z;L`YB@GDFx_Ehi~(h2{bq7IMSJE+p5lKV)O8-Hkmu;fa%mzfdmu?=$jC>V$~3C2bQ z!AXBgsx@rjaGcr81(eT;K*IonoQ3MplzcXZ)@HkAQbyBq6~i97mr3ld>?+twQEsy< z=EA<s$MJ)^^||}-t)k>EaF~SHPFiHy!Z=F{EAB{}I;wW9Ed95p^6WaM*4%(qX*iZi zIZ6}r@7{$rir&S2AWpwFxkwMtdW}fvFXKX1KgvsEx$|XdCjBhPGW41@^U>j;1z*^} z8p}HAH2t(pLd&y^MPC$<P0vBsB2V@;Ob>&?XI6b-)vp=#nNiE!aOw&)IwQ+?B$lQ@ zT$&fBn{wRDdGQz@Qm$H8uD-2S)T-K1s~TVJsy8um)h+chz76$;TGKmf8?&$LO|_;r z(Sx@z(*pXAz6og)Yg@p(Vqrte9fUK3>(FN+kUiel_s3~i#u!Rd@38I}Ga~)pmkno} z3tui9gxENee-di<`=u>$hW!o@)ZuHW!`C$~W=LFka^=2QAxRqURm6Y9E=y>4^oH{% DP$eF5 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/lint.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/lint.py deleted file mode 100644 index 83ad63971..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/lint.py +++ /dev/null @@ -1,93 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from gettext import gettext -_ = gettext - -from . import _base -from ..constants import cdataElements, rcdataElements, voidElements - -from ..constants import spaceCharacters -spaceCharacters = "".join(spaceCharacters) - - -class LintError(Exception): - pass - - -class Filter(_base.Filter): - def __iter__(self): - open_elements = [] - contentModelFlag = "PCDATA" - for token in _base.Filter.__iter__(self): - type = token["type"] - if type in ("StartTag", "EmptyTag"): - name = token["name"] - if contentModelFlag != "PCDATA": - raise LintError(_("StartTag not in PCDATA content model flag: %s") % name) - if not isinstance(name, str): - raise LintError(_("Tag name is not a string: %r") % name) - if not name: - raise LintError(_("Empty tag name")) - if type == "StartTag" and name in voidElements: - raise LintError(_("Void element reported as StartTag token: %s") % name) - elif type == "EmptyTag" and name not in voidElements: - raise LintError(_("Non-void element reported as EmptyTag token: %s") % token["name"]) - if type == "StartTag": - open_elements.append(name) - for name, value in token["data"]: - if not isinstance(name, str): - raise LintError(_("Attribute name is not a string: %r") % name) - if not name: - raise LintError(_("Empty attribute name")) - if not isinstance(value, str): - raise LintError(_("Attribute value is not a string: %r") % value) - if name in cdataElements: - contentModelFlag = "CDATA" - elif name in rcdataElements: - contentModelFlag = "RCDATA" - elif name == "plaintext": - contentModelFlag = "PLAINTEXT" - - elif type == "EndTag": - name = token["name"] - if not isinstance(name, str): - raise LintError(_("Tag name is not a string: %r") % name) - if not name: - raise LintError(_("Empty tag name")) - if name in voidElements: - raise LintError(_("Void element reported as EndTag token: %s") % name) - start_name = open_elements.pop() - if start_name != name: - raise LintError(_("EndTag (%s) does not match StartTag (%s)") % (name, start_name)) - contentModelFlag = "PCDATA" - - elif type == "Comment": - if contentModelFlag != "PCDATA": - raise LintError(_("Comment not in PCDATA content model flag")) - - elif type in ("Characters", "SpaceCharacters"): - data = token["data"] - if not isinstance(data, str): - raise LintError(_("Attribute name is not a string: %r") % data) - if not data: - raise LintError(_("%s token with empty data") % type) - if type == "SpaceCharacters": - data = data.strip(spaceCharacters) - if data: - raise LintError(_("Non-space character(s) found in SpaceCharacters token: ") % data) - - elif type == "Doctype": - name = token["name"] - if contentModelFlag != "PCDATA": - raise LintError(_("Doctype not in PCDATA content model flag: %s") % name) - if not isinstance(name, str): - raise LintError(_("Tag name is not a string: %r") % name) - # XXX: what to do with token["data"] ? - - elif type in ("ParseError", "SerializeError"): - pass - - else: - raise LintError(_("Unknown token type: %s") % type) - - yield token diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/lint.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/lint.pyc deleted file mode 100644 index 636243d480ee6b7707b8cdd84b8e4a5c1e025e21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3643 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 Vl5CCXf6}}*EsFTiyP?k*{{k3vK?MK+ diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/optionaltags.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/optionaltags.py deleted file mode 100644 index fefe0b309..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/optionaltags.py +++ /dev/null @@ -1,205 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from . import _base - - -class Filter(_base.Filter): - def slider(self): - previous1 = previous2 = None - for token in self.source: - if previous1 is not None: - yield previous2, previous1, token - previous2 = previous1 - previous1 = token - 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 preceeded 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 preceeded 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/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/optionaltags.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/optionaltags.pyc deleted file mode 100644 index f2cc7381f8dc7a4f82cfd11c9e4eaaf8a6ac2837..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4616 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 XWZWh8Fbq#w$Df0)1(ZAF?(zNvB`x>c diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/sanitizer.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/sanitizer.py deleted file mode 100644 index b206b54e7..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/sanitizer.py +++ /dev/null @@ -1,12 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from . import _base -from ..sanitizer import HTMLSanitizerMixin - - -class Filter(_base.Filter, HTMLSanitizerMixin): - def __iter__(self): - for token in _base.Filter.__iter__(self): - token = self.sanitize_token(token) - if token: - yield token diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/sanitizer.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/sanitizer.pyc deleted file mode 100644 index 0f0c913d0d82537cda20ee55a3396cadc9faebd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1025 zcmc&yO>fjN5PeSei%QUio{+e4$%P(}P$h&aK&9%Ttxy(G5gCPK<K6Yv`5<;yEh;DY z3;aj!`~haX%a(u8$eGN%*fa0VIQ(;e=hyEbo?`Qa^nLv$fR*GFv;+)L3M2w$fFwW} zA_*ai07VGXL)k~tr?`ir4>LeHL^7m!0M*BG1U1Br_73qA_yK%MMkq#@ME9tG=Bg3b zbh~7-+}5UZD%E9Ex6X|SEA&cRT~}^QL09Q%U8vM(r`pU|EeMR*xIURQ&#cnH7JEeA z$%nJkNmgm6zp3_2U+KyX2tL+^Qfy^&inlELAvp@Hmc$cd5*$x_g(>gh+)Q`Mdk@LE zI)DR~0?Pn5Bv9b!^HY2m94tfJ2!=QmX!qED6kqp1>w@yH6Q4&tN)&V2m{oY$Y047Q z)IA`?ZuqCJzEoAjBpjcy%FMj*HBJa3Hnt&Cyp(h87F{kcboIu}T2=h#<+_qbD(~j< z{k2=v)w^mXpYI>YQ=LmorJps~^fH?(D;wR&m8y!ml?zvz7lwAseD|#UN37j%u48U1 zPt3A`cr13sK&*$$NSanzsYua|56Zge42AxfXMJn#hClayNU!Do4#c^?p&Pcd&UG!b vrC*5oCd7UUKIF+czRufr#D1cj@K%)f?nIftP_NbvKV<HfNA)Bai*fiDO5*f_ diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/whitespace.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/whitespace.py deleted file mode 100644 index dfc60eebd..000000000 --- a/PythonEnv/2.7/Lib/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): - - 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/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/whitespace.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/filters/whitespace.pyc deleted file mode 100644 index e4c6d31202c2a9718fd0b3d6481e12a028130d49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1816 zcmc&!U5*n+5U%d=&e~oZ5GWu=M9K@2l?WapMMMapz~ba3TCK(?B*UP|c&2TSx95lH zo`prbPjCftf}A3U-~zco-gAM}*W=A5xxiX>xx1>myT0$MZtt)0@WY=nNNM}=`2X8q zB$;1%knvZLCMpDlf(l8Yq{5@nBY~JC-J`HanMYZV^bQq1g+9l2DDz40QqiZdPsM=3 z0eg38GbA;jcf8wxRF5`$l=b1c3D<}+_WHCL(^612r1wPch<*;ol<i>>Ucr&`>4;0q zQSTJh+N*4mg{gFFRh$=f)mYnSUzQ)|Ca+3+jVEoHr&Xq6om<r;+8pG9y;B&w!zNxN zM&%Md7<+|HlV*ucW?B`hw8oud>LgYB>!e9i-p90@MJ?99xMN;^X?-4jmun9FLuij( zPeABh9w-JONXad;D@n=&5e)wpC}7^CL+Vp7cj#I`tQ*w=kyUSO(x@aw+1Pl<zZ9GQ z!2_1+OwgN;WQjI{Hj+-6KtWGm{!V8+;Zr3|&OAD0xjZ_O)V!cmLFT~4dNkqu4F~*f zfMvYTJC??+@ZE~HSkXAk;cpOr2G^+h&1LPnEFSY|eVVYBMeQaJ%P+djk1liQGP&B` zc{0~}o=F(}C|*tIc}6Vx9^*T3nzz7hPwI}5IrCwkB`fDGlR`OJTj($=GX&5b^Z%)a zEg)?R9zSov;)SMD$Qgk40Nc1$iet1*9NSOW<9gt*QARb#>Ob9)R$3>uQL#%gQ&%dC zQF`e%VkO-&*K@Wy;>J41Gvz#T#=PQD_8?m2cHJ(b=Xv>9FB_HpYqZGA=&4$?tLX5= zuB&oZ9!Fo@yC40KFCxRW-etr`$x4~1&g<w{m08t9Yg_2AHD@eci<;>5np0h^_v({i zmruo2F`u#_;fskFiV@qfyw1PR<XGMix8xLgTUNk0vjPI+xTvyLV>;mJvZ>yx(kScj z>D<@=Km)X~JLv-MWnzZHcuow8^W|;nt`^z?4X}@^1xmUb#TN`W3QrK;h=Z<uy7vN` z%nu*$&*pJ3`+oM5#d^~&x);W2%$N59^d)HwY3`sh03b2N?byn<Y;D`Hd;uZ>C<xq3 z2-7HLfE@tk<V~y6*o0rjPE}kPC-kPuON$0ctD?@e3a(=rSPpRX1^!DE-SzInu3H}g Ur@>=?TaM&4aZ_BCH@wN@Zz5!*EdT%j diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/html5parser.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/html5parser.py deleted file mode 100644 index 9dfa4dd0a..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/html5parser.py +++ /dev/null @@ -1,2725 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip.vendor.six import with_metaclass - -import types - -from . import inputstream -from . import tokenizer - -from . import treebuilders -from .treebuilders._base import Marker - -from . import utils -from . import constants -from .constants import spaceCharacters, asciiUpper2Lower -from .constants import specialElements -from .constants import headingElements -from .constants import cdataElements, rcdataElements -from .constants import tokenTypes, ReparseException, namespaces -from .constants import htmlIntegrationPointElements, mathmlTextIntegrationPointElements - - -def parse(doc, treebuilder="etree", encoding=None, - namespaceHTMLElements=True): - """Parse a string or file-like object into a tree""" - tb = treebuilders.getTreeBuilder(treebuilder) - p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parse(doc, encoding=encoding) - - -def parseFragment(doc, container="div", treebuilder="etree", encoding=None, - namespaceHTMLElements=True): - tb = treebuilders.getTreeBuilder(treebuilder) - p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parseFragment(doc, container=container, encoding=encoding) - - -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, tokenizer=tokenizer.HTMLTokenizer, - strict=False, namespaceHTMLElements=True, debug=False): - """ - strict - raise an exception when a parse error is encountered - - tree - a treebuilder class controlling the type of tree that will be - returned. Built in treebuilders can be accessed through - html5lib.treebuilders.getTreeBuilder(treeType) - - tokenizer - a class that provides a stream of tokens to the treebuilder. - This may be replaced for e.g. a sanitizer which converts some tags to - text - """ - - # Raise an exception on the first error encountered - self.strict = strict - - if tree is None: - tree = treebuilders.getTreeBuilder("etree") - self.tree = tree(namespaceHTMLElements) - self.tokenizer_class = tokenizer - 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", - encoding=None, parseMeta=True, useChardet=True, **kwargs): - - self.innerHTMLMode = innerHTML - self.container = container - self.tokenizer = self.tokenizer_class(stream, encoding=encoding, - parseMeta=parseMeta, - useChardet=useChardet, - parser=self, **kwargs) - self.reset() - - while True: - try: - self.mainLoop() - break - except ReparseException: - self.reset() - - 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 - self.phase = self.phases["initial"] - - self.lastPhase = None - - self.beforeRCDataPhase = None - - self.framesetOK = True - - 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(): - new_token = token - while new_token is not None: - 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 - 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 token["selfClosing"] - and not token["selfClosingAcknowledged"]): - self.parseError("non-void-element-with-trailing-solidus", - {"name": 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, encoding=None, parseMeta=True, useChardet=True): - """Parse a HTML document into a well-formed tree - - stream - a filelike 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) - """ - self._parse(stream, innerHTML=False, encoding=encoding, - parseMeta=parseMeta, useChardet=useChardet) - return self.tree.getDocument() - - def parseFragment(self, stream, container="div", encoding=None, - parseMeta=False, useChardet=True): - """Parse a HTML fragment into a well-formed tree fragment - - container - name of the element we're setting the innerHTML property - if set to None, default to 'div' - - stream - a filelike 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) - """ - self._parse(stream, True, container=container, encoding=encoding) - return self.tree.getFragment() - - def parseError(self, errorcode="XXX-undefined-error", datavars={}): - # XXX The idea is to make errorcode mandatory. - self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) - if self.strict: - raise ParseError - - def normalizeToken(self, token): - """ HTML5 specific normalizations to the token stream """ - - if token["type"] == tokenTypes["StartTag"]: - token["data"] = dict(token["data"][::-1]) - - return token - - def adjustMathMLAttributes(self, token): - replacements = {"definitionurl": "definitionURL"} - for k, v in replacements.items(): - if k in token["data"]: - token["data"][v] = token["data"][k] - del token["data"][k] - - def adjustSVGAttributes(self, token): - replacements = { - "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" - } - for originalName in list(token["data"].keys()): - if originalName in replacements: - svgName = replacements[originalName] - token["data"][svgName] = token["data"][originalName] - del token["data"][originalName] - - def adjustForeignAttributes(self, token): - replacements = { - "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"]) - } - - for originalName in token["data"].keys(): - if originalName in replacements: - foreignName = replacements[originalName] - token["data"][foreignName] = token["data"][originalName] - del token["data"][originalName] - - def reparseTokenNormal(self, token): - 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 - contentType - RCDATA or RAWTEXT - """ - 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"] - - -def getPhases(debug): - def log(function): - """Logger that records which phase processes each token""" - type_names = dict((value, key) for key, value in - constants.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 constants.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 - - 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), - (("noscript", "noframes", "style"), self.startTagNoScriptNoFramesStyle), - ("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 startTagNoScriptNoFramesStyle(self, token): - # Need to decide whether to implement the scripting-disabled case - self.parser.parseRCDataRawtext(token, "RAWTEXT") - - 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")) - - # XXX If we implement a parser for which scripting is disabled we need to - # implement this phase. - # - # class InHeadNoScriptPhase(Phase): - 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) - - # Keep a ref to this for special handling of whitespace in <pre> - self.processSpaceCharactersNonPre = self.processSpaceCharacters - - self.startTagHandler = utils.MethodDispatcher([ - ("html", self.startTagHtml), - (("base", "basefont", "bgsound", "command", "link", "meta", - "noframes", "script", "style", "title"), - self.startTagProcessInHead), - ("body", self.startTagBody), - ("frameset", self.startTagFrameset), - (("address", "article", "aside", "blockquote", "center", "details", - "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), - (("noembed", "noframes", "noscript"), 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): - if node1.name != node2.name or node1.namespace != node2.namespace: - return False - elif len(node1.attributes) != len(node2.attributes): - return False - else: - attributes1 = sorted(node1.attributes.items()) - attributes2 = sorted(node2.attributes.items()) - for attr1, attr2 in zip(attributes1, attributes2): - if attr1 != attr2: - return False - return True - - # 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 processSpaceCharacters(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 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", - {"expectedName": "body", "gotName": 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() - - 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 != 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 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"]}) - - return { - "initial": InitialPhase, - "beforeHtml": BeforeHtmlPhase, - "beforeHead": BeforeHeadPhase, - "inHead": InHeadPhase, - # XXX "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 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/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/html5parser.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/html5parser.pyc deleted file mode 100644 index d16f90c409e434e2329899b6250a0bf7ea2c3835..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134117 zcmeFa3!EIsc^}v_yVw^Nz~YT1L2?L!<Wl4U1VMr#MM?|eK|&;#Py-?$2-ISByLWeh z*_qvW01KJ$*#>3Nud@@$&c*S?iE~jRzs|Xz^HY459ly?}I6gmOCAQD9<;a$;#EM_? z`Oc5n_y7OD>gt}^2SJJC4rP(pp6crA>Z-54@2l@sRb5}$F!1f4%ZF2e`)?h7$1dc9 z`rpe1L4<#~pd18qx!_zbn9B#}^1)nJaIP!J@mW47cL#Ipf^+NazAGsA1m}8!s5^+( z1?Apgt}i&(hiAC&(S3h#uHWu^bw3cC8?gJnpu9eq8w}13+I_#CZwSt9u=@esZw$_D zwEOizd1ElQDLA(&m>UYt4O#A>ayJL(HrxFM-ERrbZL#}}y5Aa{+ZxPm3(jq`+)c{e z9-P}A%<Txy?Fi;}2IqF#vmrg(6`b1@%nb+UhLO8Dh;Itwn}cXe@DhNrJBYRhY38=z zrS9O|EkU$Bcqs_Z-5NwYg7~&zIu}GcnR7h|-gB-HM7#9(_8=Nob$f#7CRKMw5ZxTa zd-cL@|H7R?)D@f>xdp>h;!urr;nLWIOL4MZEjJtSL}_lmT5B}=kQbFMm+GZzr7?t? zW~DS$jpB)NsS($T<@yLlHfU_b<w~hBJ24kGic{rcy*^&z1ADq2sZwRW*{C;aadFNv z`}tn=Qd}v$KdxEUAhT+5JlQOjqqyek?m_Oe#oDE$6p^agC?%g}JyX?6y-}<*>LYnp z!H(4Di&OED*<!6Yg@)GE_F{diRC@RPd|Z3rnd+6KJ}Vthm5SwK<#;Y;HR==}%*Ms2 zRGIM)RR0EkGAcHTNw)f5YsoT@4zM}w<ms#Pu{9!$=Zm#^d~9(lo^KGUEK@1Y#cHwZ z!ES!KF;_lOX~Z+NBFmkumMRVZ!96H2S8UAAl~2cujg^Wu39FbOo$5x4kmT<XlH`L( zG=kt_E_g8)T+ap9x`ReOcoD>foG#?#uB{7RTo+vI3SJa-zL;m`DRr#54{x7jKMKVH zMin3`RBMIlQaK(imoCMH>g2_Es!>3bt0=)1G`8av-_NH`Kl_aD43R9Z0Ig8X2pbr( zr2^_q+&GPwpD>INtoW)vU2Cv=g64=`AQnf}sRr>agGb>G+=u);I*7|;gTp&Nf=i%F z{UTD)qvvOU!Oh9@XG)dB<>^`+Wm1!+%K4)}%$f5iuQq0@m1C95=O5Vj@cCy-ljrLo zg;Ai}rQ%FnKR;iZKYux{MAh1Pj^IOOlu$wqt?iq?8V=)gY*U@B4!Snww&a>>d+G8N zyVQ$6KGHZnii8^{4nTlW;W(|+ICX2BdV&{wGUEi^fHC6`=1&Qn<JNgcDUD*O64wNj z6xiWTd?wt*ZxOrI*5kF}49Q`H?Fnz<<yKy9=EcJ_B(8>JC2I%J+wgTZ%>bGwK&Lpy z9B$%M7ZJXI1aKR$1o!-)u9$Pa-gxLWk%1xic!Q8S8c$V0d2uv_8~w-H@~nxliouP2 zH36%^Y!;pp=kUbF!Q9F>-iO5EF%Ak)?K&!d;o;zXo;1hd#J4r5AhqlHp!R6+a=;uL z?26KO6Qudr!iL~XqdT|=%0xEa118|5ZZLE9ciiZJp9N0N)kQDh-Qtc@vFN2CPDECF zyjhtdXCZGwr5Ji9IM@>tmH5iUgw@6;Wb1;8csr?BbxjuQ;A+Av^8BNvsfN&}*Z@nI z#56L_l6>xSjJ5V5YubH&O-S%AG~jOh)yaK>+%Pa^Q+{L4xHek{5TNZ769VDH#9TFM zmT?>MMYUKR2}hILH=2hO@L{&4POR+7S!?b@T2r9f6&84lKbwY?_Xan!L9PK5n5{+= zkr7n2mI?`MZ=LuR<aYOo`*>pOLFN-Ao!>zs7O_R5v1nTmivr@FAnpxt1yR2Qv9V9- ze82+8?<E&xem^D1m+<ZY<wz#hQ-EY*Fo=4U*bqd0N^H!$-Y*Gi6D3pDsn10N63B*v zXgx)zXfSvQa_r_H+Mw6B1kpw%Aj54^Vp|XmDY2bW9Y4B5q8<`EDe5t27a0fVr{+0a zIKLI#WKnoB2CoJesuzlyMLF3vry9*#T$rv^=a6eMRiQdv7@4ou>!r!^)q#ThZ?0IL zuGZ$_=$-;=ogz?)+@x_$E`J{hvKHXG_zAjtsV}JA%_#=l2#_Tc$^~RX;5M9YRJdE5 z2XCzlX7C7!o&cN!X-JI5x-Rw`quVP+*Arap<t+6gu6p4j>dFVx`QUx|VBvj9y%?fA zcv%;k)%;0tG~W}-7?3AM3$<d2LPw<#CjwOA%4}Q#AOx~PT&qD4Db))UD4GzTFpm%T zYA6+;5`(1^GYjHr1;~(%TD4rJDASmY3uK0bs$OZ#78`{trE<A28T-m=F~*@1NBasC zPbloDa3Z}HrqIesv~_AKuGixTwbrW5nOXmSA|C9^$SU=HtrE`&pOHb|lj%evHLEAq zdNpvqR=r$`gexglNc^l9Acv_}sLnNTpKr+NS-@+qc$KZK#q(uI&QSq~Q;7G?>?4X5 zE2Rd-bbz`vHA_%kj%$s2p<bN>po%lB-q+TEK<aN&33Pl!Vi{4;22)ecc(oEs+LHic zvk;mn5#DPD6Y67wuWESfDi?9K;oJg<ot))N6yA<I6`R-n2ytCy>v4HHJczrHb7Odb z7YT&CjVRZtm?kzN-xRb9{H%$1D4lC!q6C;vOgw}})Tws`oBH#EoTYO8x&C}lDln3k z*-t|EX)??YB0;&pXxfNdRC^JbkPSu0ATx@Pcq#>(G}#+`ORk%5=@rr^*z)4T0cQHz z*9BKMvBrx%$~}2z;hCTt1b=BDsC{*i%jNjY-oTTy_&XB?AY_7fT(Y7@N+kL$WeHBZ z&AJq{C~nx8QJtvSm{A5TRlxelww{H)X_6;(7LA~!k6K*EtKG;uU2Dby+Z<%uXR6it za5HjMRrm-}s^3UL?eJAwwUTAu&br@`6uxw&Sescx93ZYw2wcx0Rp&GsbYbLy0X_JC zQ*I#NpX<sE<ksajn5>(~yW;CN;f_Nh{f^^El|e)6*mZZpw@r`0Bk*RF?hR_6QKBy} z2F|wzlrs=OvAWa~)aG?N7+l=o5)&JP%2P?1O)B%@q|8vJ%wAW9vkc_if0LBioGD}N z#yr{;4D;Jt^=xZ!ahouYZQQO@WmtNUZysLhPF?}-@m)-?me>_EhLv*@a~xVW$vZ05 z!a}oDyHwX5SRXW2@UJHEb20`GjGuxM*CdgVAYmgIk@_QE@&s~)iN|3Gi6!|?mtbo+ z)hN~)r;9ToskcFXQm)Pj<)^B1^Tmb``Y^JEeyX8NdqjAgd9<Y%l9Qy(s(>0BCUV2h z(TGEuCK{CCYsD*UuRZ6Rz6;6<-^zldLUF_f$pYE{m^ZuS6!69t<cgS1=n+%`weSJH zOCUkEHx8@!4J_f2qcDJo?}kTMkPw@$(T))}o_pHlQPSR;@zIdOQ^a5WEw}`r6VgwA z9{=aIKu6pTD$?J&Aw1iF+#x>8Pf?=gAHgPSije^41T}$q5_6x{Ep$mphWTLFvVgHH z)J6QSzSE_N#$b#X0!U7fI`QljOMwZiLI^-$PRtcz63@n)9LHj%QpHeXEJhcBfaC{e z?`e|RC)N^SEfHWpg^4DowBr1HxiqCW_b)Q{Uc4`*;D!sc72(@((dcthlx->`o@kuC zHfPFTqgJfc%fw4!Y`7H{(?Z01SzBy|wKc<q23dTm&e^2hRtD}E)Cutb_^=g!8^B+C zQ!F4R2n$$+4Vn!ghYpMkLnmY(m(&`bMJd59+=f&NhVZ?-#oyY<6ua@^QvF$244-}G zH1MSz3g3d~QY8bMO~@$7WYqJwfQ7+q0^}ctF2EF!{u;WE6!806mr~%qv>_sI9a1o8 zAk~8uGy|l1k?IW=KbR*6hgv}!$kqHcXbXM8wf<o7-u#PD)Pmqre^C2o6@sm#JE(o5 z_`lLn(S|EfN`l}TW+X@+-_0v*Aue;hGJjZ^JxS(Zz<T@fb<9@y2bl!~{1>Vfx(J>P zVAkjlF7`Q<4q6HR(IbIoEliRI*krYUG(5-(>L1U&h|gL6K$3%7wE@Ly<s82TW`M7q z%b}Cd5Qo9Cp&vpsoRKN-Qm-mPIj{pML%=4h8j}h1Msb$^Dfc2?+pL<9wwmBAaLvF+ zH?qt8=qKDqU43Fj%tV<@!8Od%_!QF6Ubg}ucuk*X6Tgsqabs{16EU<lXng89pV~~l zInSqCmOQoY?blOG)NSu}tI5ym>9!?L*XijcJ>9<KDR?4UH5u@`J6fJ%NY137Jw^P1 zc0OFQ)b?O_kV*6s27ny_ybuY*HUx(_unVUG{5#Xw8C=6SV3db~#V3OoHwCpjyIvd$ zF7DFHn+OI6xQoL?SCnR<PYXAZ9tt>od%9ra__|!M@aa7Mnb1q~;J74+)c?>VF`a7l zNr;nUnwG2}4u7l?L2Qt;ails&+pE$?Vbg{Rs47p&c|aw%^tbr0*^PSjkO}%ER4Wsg zQ4%H!$k}{EE^f2PO!?~ktm=Y!pfppNgKs4}zbrHRfc}H}<(VcGky7P2q$0d`1PU`- zNS;sq>PWc?OXEzF-Ot<~p1M@2UMa`XOdK`u!m|pdw9C~}H0maWQ96!BF^80>dym5Z zREnB)6SMe1xo#>jW1zL~kE7Gne(NEH6KQl3gR1j!C2=RDELd}ugy>@gm?SYMizbnw z>8w49r;E*UW86=2FYuF;dSG99KfV+<H1CDy`N5DE$y8*J(6_1Dr=zTC#^tsRwlv!0 zksEU}wOb`N^zwNm)fxt5vm7Frz(tV&lRaDw)=yW@bI0|@VVE3h6d%;}5jNLUA#ru@ z7ZWra+wiolz4m~5Sc0LJ!_l_3+C7C(hpTCZYo}%KgDKWp9!0AL2ht=A7@O^mwNEu` zH9Q!H)~AML?)@kUnr#olJMpqcNR`5nVGz-Ht=Y^Q9!0CZ4S%w{2GH0t|L3<#m)iq5 zbbEdP`h5ZN=`LycgSp-K9m);jk8<i@euMOX+5lSrcI0>D)<d!#?xJQ0DHi2>QvU~O zcZzla(%#~2;%=OLx6!UgJ}FTY-0u0@!hloTsY{NV?4pq(OYjt^5zGiSO*~vX@Y1vL zOZanU<e{8AXlykV5{WNl73`?QHwZECx6u3n*&Px)<OvuvY1r%*yO-S)?B0~bCR|0{ z&nd$!{EJO8=7Mu=UWv=)Q8Tj2`j?vNoC%KBM*2mwZc&)lXaj?#kyc0OoQcs<pMa?j zhB)!9jOp?;Y?4)ZjEiL%H|Z^9DR3@WISX^mdPC;Mq-vQ2OBI;OXg~HAIa&b|^<iJ3 zaALYppNI2%x)ewE!9)l<XY#b*44wrTYNGpm1+{plSc}SFd^C?1D_09oJohZUztjL~ z1(^BEXcSpbVWi%Kxv*FVumA<Lv*>Ga%>N#rVaji-DaQPhPhtGR6TDFCmUkCi96Uw? zAsdreTX>9R+G;@7nn>Jo@_rH@H=pFdF4}3xviV1qNT_)a5*{^)ml6bton4SZ^KBT} zh0@L6YsW|^-Ez~egpqI*Sb-EZ9oAvAMhg@SWalPcn3`6&65kC61FdTbVtR{N0bCUU z6phr$Pyz<U4H}qf%)Ji?pc$1JcO!J<?)0-?p@>&U5p-#1{Pd!OBh1Uvf%noAu`+bv zUk<%xbM3e^9rT~UpK<ApyK_w%3C^B9JKC%OUl5Q0agZ|F6mgt?lvzb0v_lw)aHawq z7l$@uv)6MHVI8Jw7_56Jkyjwwk&WA2CX)uuap5IiI6sJ8$Z8C~8BBZCiu?i+rc!yu zw0apbC=^;FDVp@*E)lcW4zL%{iZ9^LMLyh#`G2YX>M;}msHneF6?Yb^w<_=e*-+sz z2lC&#-~+e;Fj=}QcnmN^>XhODnnXIe5g$rsjHyB*6o}oYP9{oriDNR=PzbR^m{cyo zH!d~C#0kpd;UQc)M!NVaH0CexXW;GHmfLHFA>xn6&`I1t&jfe@+C#95ERIvUfV^>? zg4UQEpj{01psUpY4n@CqQ*wjsVVBP!k0jX@Jic&KfPbb|@_XY=O5~y#VeGrZXWDX_ zwX%n;8DVe78<|Ox;+mO`&C{oVH$_BU()IG1A+xlnVssILj2Ws9Ct)P@9H`iZYHUET z#!zmDp?S+V?95{v-kyvD@E0h32sjNZ)FIfPU_LqoLlEpehv2-29p?~CGBC#+f;|Sd zmP0VHz^ZbH;g{R+1AqMv{J@8>3qQjQs62#N%4j!!5RZ8)er^k*0)B1}qCNPzBZ&6m z=guIy3qN-U(FlI-38J^)=iVT?4?m+pv=2Y~gXn(z90;NZ@N+PT9>mW>L39W|4+qg( z@$(4c(eU%OAbJcxj|b7)@$-%#8pF@wAbJ8nM}p`mevSpvar`_PL{H)8L=e3bKTikI zGx&Knh{o~rTo9ea&%1&s#LuZ9I*p%q2hsERITJ)@@$;S_I)|V42GM!^ybwh1!_Pzz zUBFK<h$itf6+{t!;vkyF&rA@_;-?fu7x8l`h|2hx3!(~sszEf5pM@Z*;in!%4g55N z=rVq;1koaXt_IQj@$*$d^rDf>Sy~B+`PX1Dmwgayh{OZyBFRRU*4i)TkRZ8`n5=L@ zJa{i59wtdVznH^6Bc8AJ#N%z(R3=3{K8K=EYYsi{tvRx_kO&$3bi5WXG$AfuRT<_W zY|!OUm1WM!T9x9z%p|;r{G@ww!>M9<imn#fY<M%r8`eHmF3q2Wwf5a`I@Ns+d`Ghg zz(o%Ac}j86L{3fBO7ji1G?QCbu3AgBnv`u^Ei0TrrW}`9XQoP0RgX&3)AY=`kXjk8 zTpr5T8D?uP2pDvH+iBfV+lNsD%*%1DQY?pYz1pn7LJ|TdCB$Jgvrpl0vZsWYp33Ng zKngg*V)MrVP`E=$LC@|CB80Bp8$1Y28MeZBTFui<4L5`dLTIBBKy{jq3My+YxpH49 zmyl1&rjSo^>`OFwAQrh2m%*fJrNw5N0S65;2yZLFI-ZFuGZ?irlhu?hlRdr^UsY(Y z^%!^a4D_wbK!>|i@a9wi0BW<it-D+H7q_QN@Xe^dxM}Ey&9Ukai<PQ<mSMbAeJ_{h zFo9HNFwF7c$_((6a7uD9&~Z_@tc?ajc;aF6n{B8z%b2wcj)Y|x#L|0%S9*V@6af(F z{T1C4FmuKFCA5UtY?UOLXozf#!g)fAC9OzuXI~+BD$Tj)reODU(84Y3rv8?+<Hmx8 zdFw`jq9|^Ov@MOu<hQhgjdSHwgvw;5_(bTrlGf-<hP9i$umL~ZIBPy=4S%t*n7KRL zcu(f8*tnXxJKQ*zxhpo_FK#gpqKRvl<HKb*ep_;i%2D5vGBf}*LdtLw%aeDD%9koH zm*jj+NOL*1zR)P-v#d81Q9yHNC4nHZm?YklB(7@wVVjGKjU$ZD%G@hnOMS8DN1L_G zU4%P2AQN_R3|ywdWeN3`Y%(90%^^ujAIJ9)G*=fLCYjUOOm?;j%LP!tm>geEGBN&3 zGmkCKgHF(eY{@vu<WScE%3_3o7sNk`ax4Re5N41PP;0I6-1Iaw==8p7_o|^09gQ!S zBwt$%jVSUNRzs;VHG3LUjB&|&gZEe;fqT`^tW6`J>lCJ!IGa&d1_!ZzwT@unXF%{x zM6he9EvuYl@jH#;WI2AmSZ=!S=>D?ZQ@cV(V3j#5hlQmVGwJta(pSaI=(Wz!BX1o& zvbM{m_{tMitAXiBq)E0+pVpWBt$j>`un1E;qK3++V91ziRBM(wWts3vq?uQjD|xlO zB)|CnYIW{#B|2HG=!?89R-$>_65FZ5NLx`HQn^&OfFyG2Hkmv8Iuti&MXfYb!u&`9 zMB&zOtuVcIf;YK=O%A7?e=?Q2`zUq4jAsEtje6JY|AG81FnJGTWq!*2vJO0lCYInH zg)C_PXy~}pko>zKTq4i>(JpVD<(WU)<@H)#pM2CVuix?z?}YJndFw52Fq;R5BEPXQ zo3{yhaIbDw9vrxA3zZ7FTv?yXqlSUJ?b&ivH&9}y@^;$0JCO$!#Juh<5Bdm|%uo{W zFvMjzlTFcVk(GPfWM!00WMw9uqG`F0FZAZ{&tzo=n~f`Qa}lz~B~dO`Q8i)S)l8z? zN0S^<Yq2(k(Ak!!E{8NSOEHY3WH0JgGX-Bs^Hl@$>$BA>nS9-Hz`@w?0(p^DWcPeS z!fRTSZfQhf<P4uv?v|8<j7N3DT(LI_Qq0v2zoJkV%{$DtJLcmKQ;ojP)T0I))*~Lk z&zYl8p2-j5b~y$RlAL71hQLWL>e>=MeYHmT$E`Uj@sqOZd-0sazirw7cXsW}5+>B| z052I~Qk?W=JD?{6DiUKH3x;F7(4X2V#vT_2C%=n)T;uXN$Akl09GFinvEhsTynu(G zYIxF0i0cp&I+Pe5K>6f2h_5A+L6idd3VsIcha3fri%dizA&zex0=s|-LO)~@EoKOk z{ig+11dqXg1>D2GVOi~tzVI_nS4OM~)MGs10zRnD^6|0wO%_n{NoB1I>ObX7rI>`A zFK`{-q}31a-^|#i+Mgzc|1`C$Lh~N1ZOfr<M9sMB`-4ke0Wud}cJDil{UP}<5U&Hh z9T7qd3_6K2sG^1|nud`7EzsvJ8&A$4E*bd~FwqcWb_4L^qTN!(rgg<C*krC`sd5B9 zxF(0F5!uhIxL2tXf{`e{Cc-UMPE&|^q8eRQfySgyah<2-O;@W8kw5A!%HJjiIOWn* z5%C0zWalbRBA$O<ZJVl=XLLhu=ssiB@q@0J`ffK0=wnRi`{Y{)s&Ju`stz6-#Zih2 zx-e8WP%k5-Pd3vM-V5X*%R+?w%(tfHV~hnHp+uPa(!vSe(!y@>6vvsG<K+l1ie;N( ziXjh1tlrCD0uLfXWeLZ6F&YCbGQX18$C;3nLp6s>$`pk<f}6GR$(_cBXGzaT*#!8@ zR}*Un^6<vPlfFa#^uaE8-SfM1J@CSBhOf8>{=B}tcUO@8izCpy3S0;2GnQ)$xdWUL zjz~ZQT2aH98Qg*)PDk`i(Pb>u#U(WrL|Q40aC@K0gci?C7|p?wNwYC11*T0d0OZIt z--C<R43(w|2+=)!`tbhn@R`%c&YmvNr$KjKu{?v|AuJvCu2-ksp5}^|QTG}hy6#P1 zPK4kxg>&`=p(W*a3mI6U)Clq1kn12)ihZ$A<YVS_G^fl-mU@ntab7q<s3@8&q1hsi ziI1sgCX`K^Q*)*#YldZ-M>LCAjC5!r+8-v~QQZo<x8#R_MceaR@`L&D5gNt9eZ1_) zMGC>h1i}ok*ifQ`L?5yp1_x+j;!+$VVv*_NeD^6{p5Wy?FN|VR=t=lKrt}Ru;lc~N z(5(@EfR}IN<(ql=7G6jo;dkJYLQknTc-f$q0v<p!6uRA$?_tRHa8GW_=KekX1N~k7 zWBuJ*HewmX(59aLzW(0+C;N9G_r58>IAC81vn~d`8~|a0(q7UW4Hbb2(4HbzIVH*F z%#hEVwn)%I!Ry#l;T!PUy5MCP88NAAu^@9HUt=<Nxmqx&TuhezE*Eki-xvtK-mNQ! z`(b_SvqAq1qQQpNXB+)95cQ_kXG8uOgow?p&$jqyU<+GYpKbHcFx75veYV3t!*si| z_1P}}3}VV~>$98uGq_N0Zhf}fKZ9IzOY5^+{WJJnZfkv3@Xw$a-QN0akADUy%^j`J z_WEa#obGIWc9(w!ug=}A&qn++tkJxu_1RneGss`}wm!ShKf_AS(bi}C{4*$R`&*yg z@1N}oN{DF%E*%ICQPP4Jh>Nif;s+@4Abv3V58(#`4WAH$lpn?qh7YbG#2v#sbciv* z@DL#q7EYo=2$Q9w2mz|_6&*rsD*Z(-0#@(955NMq(Tjk<Vf>)8@E*O0ejULNx&SBA zi)igJ{Opo1>D0)RAfIs&6Qw7RkgZ~;{~Ys~(G#47kSQ@?fdr0%eDLoZv>^V2ASIBP zmey0O%wcX~70m~6d8RrugRm3D8P&KTII6ovg%S-IU82>JSif0B=#ZiU)ezRezdEV< zb|gT$FYJ_S74gcTWX-MkFv8dX*;Ls;QMbPd`?BwTMSs#-P97oqRm$t$U^Z8$SoGKo zmiR8t*WUh7P7rKkPoN&NeH15eV~;<L1o+NH`~!Otv}^xf3!sz+v@ao8{@=?az~KC@ z;Oa1)(l28G01ikB!?+xRbbqFTJ#uonuY*9A3(mTS016^1DDN+-JXcZyF<~R1GJua_ z9}sLYA^C%8tqwzD+#^KcuUC8>N-AMZMHSOp_>#lDv04n%{|JO=zt?!N!{d@392Q8z zHR*zWxNbbJ&`u^HmNTYeHDp4qGl)2xL|#asN@T#oR85zZYwD(NKFtD`c;UxP&X9<~ zmnLkTDfT_k!$*)MA(txwLz0Ba8Ei(WGF>&jb(Ezj+R*5rJp*jj;2Vre5*x167!MqM zKM{%HKS6FU%w}D1m{ZQ(n%kVe8L}*8+5xO}vfw&~TL@$!t=L*Yn|3Vx9^{SS&nfBb zZ1_)cd4qcwa@_s}yVZw80BK-He#;gg=t817MJm~a1n{gjL^frj_9^fwTU&+Klc3i7 zkyN;_nQkdu!R49mOP~m9hAV2}@dS6OFesql8{K!AjA2=a7r~nI6NCeW{eT0R7ax;U zJjFcz$DV5M1gdv2HW&cQz*RcOOGtnrND?{+67Ql&ge|u~>r7z&u{{zn1KA!4n1gJO z1k6IVM*`*{Y>j}z>$z_MalbjvFT%*?*3!eaRhW&-h!adU0<vJ#xp}w2l5uxq`3NFS z=)E%Ibq%js`N3siC&m=xi*A|hHldC!H7ilU$fyTnxK+&Dnhjz|8U5!taNS4*jMCyD zC4WL*F%fBtQ966EM1$t}@oM8l0=_sp##lKE?;)F7yMC4N^<QAWI83mR@rQrxrh0Wd z5}YM8aoO-OEnFOi;B9t6zTzUmILTXpBgxV<M7O{|=88@+7lxdje%W`u%Xgi9QP;O2 z;k#~gcBZ%TS~fZL!z+dGM`(PULacjZcvY%e$MhD17W^mQ+jO8gTv^`h2O1q_Bw@D4 zL<;XPvoRh(mW?r2C3Z}2!8C(kf6aRveiYSqOdqGwm`|<N$L%O!_zSw_a56{{LwZVG z7*FLfRN^+>gD;i~-=Bhqw2ZwRND3B`ObgB0aj6-6{nKq-B{EXZ6Y_o-2~VnnwfiMU zqsNr1VWh*ou`rnqh}95_7vH5)5S5)0^ujx&j$m6a#jEiZZB&FAbr{k!mJ8MnCkFZK z1I%TQEgTN;?+nB^`%*Hqah^{hEs$%aH+dr$((z`rMw4|yTx3gb>x(g@!gum=ftTBP z;nZkm-}f+e0v8hmIgg|QE@R@tf5eCQv&$PS^GWWJY)^zjH$TGxr05^yZpm%!x&>nG zt;_JCSBJHPBUaFLAkNOBWuH%RHdT6LCJg@p9!shSIR$Gn3dy5GvaXP{9TMxq@8^Ye zr30zd8$6ofN6>_yWp_9$%A(f|i`_c>+5ZC??-L00!X6tdh_kc}dvW$92%ulGL<{+~ z50(148x1suAZkKdGS;}ku2Z-f2ltOt%<zr(Q}Hb*;JH~==JN6u`{_0;5JUKvxVIGz z$*QVO=`7jV7uq^YrbvNWth<SaZhoQ}2s4%0KbT4bg}FHa{E9#rIA*$n`dOJd5JTCo zG!!AFYnSBu1ha-S6KP4U6jpmV@saD(V1lC9B<*Xc4}sM)6Xnc>qY09pQ9NTEKgbtg zF~OP?RNzXl3kK_3bFR^@LAXajXkG7QK|V$uPs@qqA3eiIwZBpm)dm)W*=G;0u*qD9 zcy&}0)}9>fdDi-g{-E-RT7k-+Rprkl-x^ni@8#>R|L@Hqj68kOx&})hbiNbvHo^Rq zxMu04$;?e8r1|C~HXk_=$%|=0WVoRf3#LBU`)r!h3`V7<I9Y8r9xY=*;ndYp+Z#vm z#?1=Xj8_twn8HKQd<!o3?%!W8l@V@QD(~MPHKGEmqWW04e1Gl0fx>}D9(nlw1NR@; zzhBnI(f#|2(dA;jI^8Ig8&T$!gZu8sy2LASRB9CN#a?nr&>&vqclcuc#){Lcg5ssP zF`aqg0n}fPFUREq+ww|f9zdD9R;-6hMX~o?THOs6Wvw&=E#Eq;6-5{WvTPANqd{f4 zX9waHUj$_Fj4WvBiwE~TfVHp)eOu*iwwiPJGH>I_&C5P9(D1vfJ?BWQ_MBf{?fF4G z-?QxZTSkb@xPfA9%?%V|qi&!W+s3%9rBL(ZOoChT7_V`1Lq5!1wNld|y}JQrA&eL+ zl({-iqxO(1TtdJX$;wb30qcy2$I{`&`7#2DY6arIXw!dw->ZBREu)!^ExVDADI688 zZ{BDN$pOB&7A9}LiWc$}-@-erTYwj0aN%+X<D1)uYi)jC%0W=MV?-;Lb7;q2q{XXP zx{Hk}uVQ6(1Qu7XVq<fx|4wV>*q}J)eE|2Bi;Fo%aa1^<_ulrZ->b#t;-Y_l+}<bh zEHsM|_K=)zV6#0i6!G(FgLYTr>4)~+|LCJ&>5trh=>7wbKALiAt}WKsJ*XxfYprsb znov$PJ&d^lsTFJ5>uQ?6I>QZ(TY+ZN1Rw$E-RlZ2v=y06+TS**jJop8O2N=sG1v8$ zQLi>GV$&9N3}1Ng#@}eg12@@RIXIPR+d)o^4~^b`aP)x(QTcAGysZqlb5tvms8=qK zuy0ypfj&!Wz`Kt3FL_k=wJ+O5j1iZrEAR=mI4Wtag=Mt7LaQIeksSMKEk~;wRx6No zVFrHWkwf=Ce1M$P&77+ghWzm01LVza4)R5>985-LIO%%T0PLO=Z01Ya9Zxpmso8{| zR^Jbrw6S&cm%w1fa%h7?$14ZhzT^g6AB-y~Xfp)c>V={upo%NaLelaqYM|hOEa3e| zmlSG){G+ICw$Ye>6liee%D&R%+&-|f{j~708T&6EIItg?+Jx=^H~7K244X*y;jsdU z+}?}r?b0jcH><TPEtIVqz}Sd(X(bbQj{Cp>veNAwM;^xQSL8`Ao_<B1Y?I!<B2OL! z9eqWf1o!@mJoy!Qa;apBIrA&><X7a$H<>(XVR&A?dyRz3ZU|FU#^mjLZAHxGt4syI zjJn`^<)qfMP^)yfe3gkZ`9%rB=9*Eg_84Gc&NiyonHYEMRz~lBc#Z|u^YUH1Jj=^7 zyezZALf$yrhdFCom7PAZtt#%z*;c6ut%<8nj;BATk^YC+gk*<9>}0qrw-u4@{fc+r zlHZAdCB(eEVgGZ7e144)Z@dnoJ=_~Ho3klDMP~^A^7xZWf$}i?-86$E*eFTR4FK1I z%at3zofnl=W!f|i5=S`3OWP>(gK~|p*{I3khVA<rvse{!3>(-#4*<CMq`}m&>Y+kY zvUT2vpt}9(;CG-mBZ&)O!S=A0QJe-fI#X?oVu>{l_UmHr$9TEG%MatyF~I_Kpu)45 z#Mli1oxO`~9i9nA?n5FA420S`*As9=`wa7`7Umjg*yC~O=_`Up&hAk}t)`I`oeU?s zmnR4(GN%B<wdJ*hQ~`Ca2q}2%-#l=dWlxsCX$jL=oxBjBosie=RUuQIws4LyluC(9 z>-jn*UJwyAS>m#VVRR2zWWzL5bo*L719^i5H7K5e&{W7n$~TpIqvIKV5bgLQ45AL_ z!M3}MVz|)XjfjSx{vK^l{DeO~WQA~sCsD;~63&1q2Dw-hoZ_S-E=3{4bE$@+CBU8# z1pq&?c(<I^bd$4`)*eQ9RTyNRT?$5W=ALq)U2RKJwd$}vlrKa)l0bk%WXsrB7SS~d z#5azgN;+#l2ZpBrp&Id#FylFZUK(KI1Vow>4TzlQ7*6hjLhu>_pm{lhOQ%rRm9#gR ziHj47dh^A_hJ^nsd#DckII)xf-)Pz+bNDKDlMTuQ9s42UU<#3$(}B@DU%gu6Tk%bD zm34zx;akTH1VyE<WnYYXGWf=k5x&v!l|;H&Fy(DpoB@7=NRoUSJwxJBXNjtruo6}+ z^^yr∓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 E0RazalmGw# diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/ihatexml.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/ihatexml.py deleted file mode 100644 index 0fc79308e..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/ihatexml.py +++ /dev/null @@ -1,285 +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]') - -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]') - -# 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, replaceChars=None, - 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, namespace=None): - 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("--", "- -") - return data - - def coerceCharacters(self, data): - if self.replaceFormFeedCharacters: - for i 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/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/ihatexml.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/ihatexml.pyc deleted file mode 100644 index 70f78ee5899474e017a0ec81ef099316b5168cba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16158 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 UdJ)nq@OM^q^}>pUl?yBX3ta50#{d8T diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/inputstream.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/inputstream.py deleted file mode 100644 index 00d837fa5..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/inputstream.py +++ /dev/null @@ -1,881 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip.vendor.six import text_type - -import codecs -import re - -from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase -from .constants import encodings, ReparseException -from . import utils - -from io import StringIO - -try: - from io import BytesIO -except ImportError: - BytesIO = StringIO - -try: - from io import BufferedIOBase -except ImportError: - class BufferedIOBase(object): - pass - -# 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_re = re.compile("[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uD800-\uDFFF\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]") - -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\u005B-\u0060\u007B-\u007E]") - -# Cache for charsUntil() -charsUntilRegEx = {} - - -class BufferedStream: - """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 -= pos - 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 "".join(rv) - - -def HTMLInputStream(source, encoding=None, parseMeta=True, chardet=True): - if hasattr(source, "read"): - isUnicode = isinstance(source.read(0), text_type) - else: - isUnicode = isinstance(source, text_type) - - if isUnicode: - if encoding is not None: - raise TypeError("Cannot explicitly set an encoding with a unicode string") - - return HTMLUnicodeInputStream(source) - else: - return HTMLBinaryInputStream(source, encoding, parseMeta, chardet) - - -class 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. - - """ - - _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) - - parseMeta - Look for a <meta> element containing encoding information - - """ - - # Craziness - if len("\U0010FFFF") == 1: - self.reportCharacterErrors = self.characterErrorsUCS4 - self.replaceCharactersRegexp = re.compile("[\uD800-\uDFFF]") - else: - self.reportCharacterErrors = self.characterErrorsUCS2 - self.replaceCharactersRegexp = re.compile("([\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF])") - - # List of where new lines occur - self.newLines = [0] - - self.charEncoding = ("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] - - self.reportCharacterErrors(data) - - # Replace invalid characters - # Note U+0000 is dealt with in the tokenizer - data = self.replaceCharactersRegexp.sub("\ufffd", data) - - 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 i 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, encoding=None, parseMeta=True, chardet=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) - - parseMeta - Look for a <meta> element containing encoding information - - """ - # 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) - - self.charEncoding = (codecName(encoding), "certain") - - # Encoding Information - # Number of bytes to use when looking for a meta element with - # encoding information - self.numBytesMeta = 512 - # Number of bytes to use when using detecting encoding using chardet - self.numBytesChardet = 100 - # Encoding to use if no other information can be found - self.defaultEncoding = "windows-1252" - - # Detect encoding iff no explicit "transport level" encoding is supplied - if (self.charEncoding[0] is None): - self.charEncoding = self.detectEncoding(parseMeta, chardet) - - # Call superclass - self.reset() - - def reset(self): - self.dataStream = codecs.getreader(self.charEncoding[0])(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: - stream = BufferedStream(stream) - - return stream - - def detectEncoding(self, parseMeta=True, chardet=True): - # First look for a BOM - # This will also read past the BOM if present - encoding = self.detectBOM() - confidence = "certain" - # If there is no BOM need to look for meta elements with encoding - # information - if encoding is None and parseMeta: - encoding = self.detectEncodingMeta() - confidence = "tentative" - # Guess with chardet, if avaliable - if encoding is None and chardet: - confidence = "tentative" - try: - try: - from charade.universaldetector import UniversalDetector - except ImportError: - from chardet.universaldetector import UniversalDetector - 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 = detector.result['encoding'] - self.rawStream.seek(0) - except ImportError: - pass - # If all else fails use the default encoding - if encoding is None: - confidence = "tentative" - encoding = self.defaultEncoding - - # Substitute for equivalent encodings: - encodingSub = {"iso-8859-1": "windows-1252"} - - if encoding.lower() in encodingSub: - encoding = encodingSub[encoding.lower()] - - return encoding, confidence - - def changeEncoding(self, newEncoding): - assert self.charEncoding[1] != "certain" - newEncoding = codecName(newEncoding) - if newEncoding in ("utf-16", "utf-16-be", "utf-16-le"): - newEncoding = "utf-8" - if newEncoding is None: - return - elif newEncoding == self.charEncoding[0]: - self.charEncoding = (self.charEncoding[0], "certain") - else: - self.rawStream.seek(0) - self.reset() - self.charEncoding = (newEncoding, "certain") - 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-16-le', codecs.BOM_UTF16_BE: 'utf-16-be', - codecs.BOM_UTF32_LE: 'utf-32-le', codecs.BOM_UTF32_BE: 'utf-32-be' - } - - # 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 - self.rawStream.seek(encoding and seek or 0) - - return encoding - - 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 in ("utf-16", "utf-16-be", "utf-16-le"): - encoding = "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): - 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 byte 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 = codecName(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 = codecName(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 codecName(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, bytes): - try: - encoding = encoding.decode("ascii") - except UnicodeDecodeError: - return None - if encoding: - canonicalName = ascii_punctuation_re.sub("", encoding).lower() - return encodings.get(canonicalName, None) - else: - return None diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/inputstream.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/inputstream.pyc deleted file mode 100644 index 8645eddd65e1c6e51c42e0f86580dba6b40ef1d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29629 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 D*K{D# diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/sanitizer.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/sanitizer.py deleted file mode 100644 index 71dc5212c..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/sanitizer.py +++ /dev/null @@ -1,271 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import re -from xml.sax.saxutils import escape, unescape - -from .tokenizer import HTMLTokenizer -from .constants import tokenTypes - - -class HTMLSanitizerMixin(object): - """ sanitization of XHTML+MathML+SVG and of inline style attributes.""" - - acceptable_elements = ['a', 'abbr', 'acronym', 'address', 'area', - 'article', 'aside', 'audio', 'b', 'big', 'blockquote', 'br', 'button', - 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', - 'command', 'datagrid', 'datalist', 'dd', 'del', 'details', 'dfn', - 'dialog', 'dir', 'div', 'dl', 'dt', 'em', 'event-source', 'fieldset', - 'figcaption', 'figure', 'footer', 'font', 'form', 'header', 'h1', - 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'input', 'ins', - 'keygen', 'kbd', 'label', 'legend', 'li', 'm', 'map', 'menu', 'meter', - 'multicol', 'nav', 'nextid', 'ol', 'output', 'optgroup', 'option', - 'p', 'pre', 'progress', 'q', 's', 'samp', 'section', 'select', - 'small', 'sound', 'source', 'spacer', 'span', 'strike', 'strong', - 'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'time', 'tfoot', - 'th', 'thead', 'tr', 'tt', 'u', 'ul', 'var', 'video'] - - mathml_elements = ['maction', 'math', 'merror', 'mfrac', 'mi', - 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', - 'mprescripts', 'mroot', 'mrow', 'mspace', 'msqrt', 'mstyle', 'msub', - 'msubsup', 'msup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', - 'munderover', 'none'] - - svg_elements = ['a', 'animate', 'animateColor', 'animateMotion', - 'animateTransform', 'clipPath', 'circle', 'defs', 'desc', 'ellipse', - 'font-face', 'font-face-name', 'font-face-src', 'g', 'glyph', 'hkern', - 'linearGradient', 'line', 'marker', 'metadata', 'missing-glyph', - 'mpath', 'path', 'polygon', 'polyline', 'radialGradient', 'rect', - 'set', 'stop', 'svg', 'switch', 'text', 'title', 'tspan', 'use'] - - acceptable_attributes = ['abbr', 'accept', 'accept-charset', 'accesskey', - 'action', 'align', 'alt', 'autocomplete', 'autofocus', 'axis', - 'background', 'balance', 'bgcolor', 'bgproperties', 'border', - 'bordercolor', 'bordercolordark', 'bordercolorlight', 'bottompadding', - 'cellpadding', 'cellspacing', 'ch', 'challenge', 'char', 'charoff', - 'choff', 'charset', 'checked', 'cite', 'class', 'clear', 'color', - 'cols', 'colspan', 'compact', 'contenteditable', 'controls', 'coords', - 'data', 'datafld', 'datapagesize', 'datasrc', 'datetime', 'default', - 'delay', 'dir', 'disabled', 'draggable', 'dynsrc', 'enctype', 'end', - 'face', 'for', 'form', 'frame', 'galleryimg', 'gutter', 'headers', - 'height', 'hidefocus', 'hidden', 'high', 'href', 'hreflang', 'hspace', - 'icon', 'id', 'inputmode', 'ismap', 'keytype', 'label', 'leftspacing', - 'lang', 'list', 'longdesc', 'loop', 'loopcount', 'loopend', - 'loopstart', 'low', 'lowsrc', 'max', 'maxlength', 'media', 'method', - 'min', 'multiple', 'name', 'nohref', 'noshade', 'nowrap', 'open', - 'optimum', 'pattern', 'ping', 'point-size', 'poster', 'pqg', 'preload', - 'prompt', 'radiogroup', 'readonly', 'rel', 'repeat-max', 'repeat-min', - 'replace', 'required', 'rev', 'rightspacing', 'rows', 'rowspan', - 'rules', 'scope', 'selected', 'shape', 'size', 'span', 'src', 'start', - 'step', 'style', 'summary', 'suppress', 'tabindex', 'target', - 'template', 'title', 'toppadding', 'type', 'unselectable', 'usemap', - 'urn', 'valign', 'value', 'variable', 'volume', 'vspace', 'vrml', - 'width', 'wrap', 'xml:lang'] - - mathml_attributes = ['actiontype', 'align', 'columnalign', 'columnalign', - 'columnalign', 'columnlines', 'columnspacing', 'columnspan', 'depth', - 'display', 'displaystyle', 'equalcolumns', 'equalrows', 'fence', - 'fontstyle', 'fontweight', 'frame', 'height', 'linethickness', 'lspace', - 'mathbackground', 'mathcolor', 'mathvariant', 'mathvariant', 'maxsize', - 'minsize', 'other', 'rowalign', 'rowalign', 'rowalign', 'rowlines', - 'rowspacing', 'rowspan', 'rspace', 'scriptlevel', 'selection', - 'separator', 'stretchy', 'width', 'width', 'xlink:href', 'xlink:show', - 'xlink:type', 'xmlns', 'xmlns:xlink'] - - svg_attributes = ['accent-height', 'accumulate', 'additive', 'alphabetic', - 'arabic-form', 'ascent', 'attributeName', 'attributeType', - 'baseProfile', 'bbox', 'begin', 'by', 'calcMode', 'cap-height', - 'class', 'clip-path', 'color', 'color-rendering', 'content', 'cx', - 'cy', 'd', 'dx', 'dy', 'descent', 'display', 'dur', 'end', 'fill', - 'fill-opacity', 'fill-rule', 'font-family', 'font-size', - 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'from', - 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'gradientUnits', 'hanging', - 'height', 'horiz-adv-x', 'horiz-origin-x', 'id', 'ideographic', 'k', - 'keyPoints', 'keySplines', 'keyTimes', 'lang', 'marker-end', - 'marker-mid', 'marker-start', 'markerHeight', 'markerUnits', - 'markerWidth', 'mathematical', 'max', 'min', 'name', 'offset', - 'opacity', 'orient', 'origin', 'overline-position', - 'overline-thickness', 'panose-1', 'path', 'pathLength', 'points', - 'preserveAspectRatio', 'r', 'refX', 'refY', 'repeatCount', - 'repeatDur', 'requiredExtensions', 'requiredFeatures', 'restart', - 'rotate', 'rx', 'ry', 'slope', 'stemh', 'stemv', 'stop-color', - 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', - 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', - 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', - 'stroke-width', 'systemLanguage', 'target', 'text-anchor', 'to', - 'transform', 'type', 'u1', 'u2', 'underline-position', - 'underline-thickness', 'unicode', 'unicode-range', 'units-per-em', - 'values', 'version', 'viewBox', 'visibility', 'width', 'widths', 'x', - 'x-height', 'x1', 'x2', 'xlink:actuate', 'xlink:arcrole', - 'xlink:href', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type', - 'xml:base', 'xml:lang', 'xml:space', 'xmlns', 'xmlns:xlink', 'y', - 'y1', 'y2', 'zoomAndPan'] - - attr_val_is_uri = ['href', 'src', 'cite', 'action', 'longdesc', 'poster', - 'xlink:href', 'xml:base'] - - svg_attr_val_allows_ref = ['clip-path', 'color-profile', 'cursor', 'fill', - 'filter', 'marker', 'marker-start', 'marker-mid', 'marker-end', - 'mask', 'stroke'] - - svg_allow_local_href = ['altGlyph', 'animate', 'animateColor', - 'animateMotion', 'animateTransform', 'cursor', 'feImage', 'filter', - 'linearGradient', 'pattern', 'radialGradient', 'textpath', 'tref', - 'set', 'use'] - - acceptable_css_properties = ['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'] - - acceptable_css_keywords = ['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'] - - acceptable_svg_properties = ['fill', 'fill-opacity', 'fill-rule', - 'stroke', 'stroke-width', 'stroke-linecap', 'stroke-linejoin', - 'stroke-opacity'] - - acceptable_protocols = ['ed2k', 'ftp', 'http', 'https', 'irc', - 'mailto', 'news', 'gopher', 'nntp', 'telnet', 'webcal', - 'xmpp', 'callto', 'feed', 'urn', 'aim', 'rsync', 'tag', - 'ssh', 'sftp', 'rtsp', 'afs'] - - # subclasses may define their own versions of these constants - allowed_elements = acceptable_elements + mathml_elements + svg_elements - allowed_attributes = acceptable_attributes + mathml_attributes + svg_attributes - allowed_css_properties = acceptable_css_properties - allowed_css_keywords = acceptable_css_keywords - allowed_svg_properties = acceptable_svg_properties - allowed_protocols = acceptable_protocols - - # 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 list(tokenTypes.keys()): - token_type = tokenTypes[token_type] - - if token_type in (tokenTypes["StartTag"], tokenTypes["EndTag"], - tokenTypes["EmptyTag"]): - if token["name"] in self.allowed_elements: - return self.allowed_token(token, token_type) - else: - return self.disallowed_token(token, token_type) - elif token_type == tokenTypes["Comment"]: - pass - else: - return token - - def allowed_token(self, token, token_type): - if "data" in token: - attrs = dict([(name, val) for name, val in - token["data"][::-1] - if name in self.allowed_attributes]) - for attr in self.attr_val_is_uri: - if attr not in attrs: - continue - val_unescaped = re.sub("[`\000-\040\177-\240\s]+", '', - unescape(attrs[attr])).lower() - # remove replacement characters from unescaped characters - val_unescaped = val_unescaped.replace("\ufffd", "") - if (re.match("^[a-z0-9][-+.a-z0-9]*:", val_unescaped) and - (val_unescaped.split(':')[0] not in - self.allowed_protocols)): - 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 - 'xlink:href' in attrs and re.search('^\s*[^#\s].*', - attrs['xlink:href'])): - del attrs['xlink:href'] - if 'style' in attrs: - attrs['style'] = self.sanitize_css(attrs['style']) - token["data"] = [[name, val] for name, val in list(attrs.items())] - return token - - def disallowed_token(self, token, token_type): - if token_type == tokenTypes["EndTag"]: - token["data"] = "</%s>" % token["name"] - elif token["data"]: - attrs = ''.join([' %s="%s"' % (k, escape(v)) for k, v in token["data"]]) - token["data"] = "<%s%s>" % (token["name"], attrs) - else: - token["data"] = "<%s>" % token["name"] - if token.get("selfClosing"): - token["data"] = token["data"][:-1] + "/>" - - if token["type"] in list(tokenTypes.keys()): - token["type"] = "Characters" - else: - token["type"] = tokenTypes["Characters"] - - del token["name"] - return token - - def sanitize_css(self, style): - # disallow urls - style = re.compile('url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) - - # gauntlet - if not re.match("""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): - return '' - if not re.match("^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): - return '' - - clean = [] - for prop, value in re.findall("([-\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 not keyword in self.acceptable_css_keywords and \ - not re.match("^(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): - break - else: - clean.append(prop + ': ' + value + ';') - elif prop.lower() in self.allowed_svg_properties: - clean.append(prop + ': ' + value + ';') - - return ' '.join(clean) - - -class HTMLSanitizer(HTMLTokenizer, HTMLSanitizerMixin): - def __init__(self, stream, encoding=None, parseMeta=True, useChardet=True, - lowercaseElementName=False, lowercaseAttrName=False, parser=None): - # Change case matching defaults as we only output lowercase html anyway - # This solution doesn't seem ideal... - HTMLTokenizer.__init__(self, stream, encoding, parseMeta, useChardet, - lowercaseElementName, lowercaseAttrName, parser=parser) - - def __iter__(self): - for token in HTMLTokenizer.__iter__(self): - token = self.sanitize_token(token) - if token: - yield token diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/sanitizer.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/sanitizer.pyc deleted file mode 100644 index b2fbb0de13c449b5e355a79e265720ae1e9c04cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14580 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 S88dEz+uIdw*X?7wKJ#xZZL;P7 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/__init__.py deleted file mode 100644 index 8380839a6..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from .. import treewalkers - -from .htmlserializer import HTMLSerializer - - -def serialize(input, tree="etree", format="html", encoding=None, - **serializer_opts): - # XXX: Should we cache this? - walker = treewalkers.getTreeWalker(tree) - if format == "html": - s = HTMLSerializer(**serializer_opts) - else: - raise ValueError("type must be html") - return s.render(walker(input), encoding) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/__init__.pyc deleted file mode 100644 index 027e1308a8ac9624b647d08ec9a52fbf718ece53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 942 zcmc&y-;2{g5S~r?<9haNefOb{LGT^~5ky461HoD(cX&_&G3jpGz1wWU?rf#fd+~hr z(f`qR{{d%GulgStlF97s?Cke_Gx4vJ;~zhxbOC>!4*g$!iomDjNO}brfJ(qzKo!9} zf+~i23_?aAV=x`4x-jq3x&yKcrUz9Y=6zcCK=wfnKpw$2Izr9>&XZ#*tNE@ZCW9j~ zMd@o3Q02O6YKM44F{wA&>)PU&7QyO8EmdwbDpwe<BMK&h4Blhol=@tlYvsJ=;C|;m zd2cV?PtTRph0$M>3tb8+&JN6Sjg?uj)2ENYykpu^auDE3z)rxefSWGth^c_<2;3vU z2zDL#4sg>0I|Ph@bfC1al;4A^4(uo&II@f3HX_1Yd3LxkJmC7<Mop^VaZ;)Y!$=re z+6r<)-b&#Gp}cH4r3?{SwvUAg>dZOPs7FhutW+*x^vLJ6Z31GOO^4f*W$mhBFQ~F4 zp|-15aevSxuN(Aj?p{G;0ewOSTH_sg@_Dw>xDI7@sqJgCbV~l?mD*-+R2f#;hb^va zduBJ;lhbF}RF|2jjy-OQ#dWb#K5KN7Z3uPkGG_hMaK-^jmgm}P%=6P`ivxynx5WeD zSpkSgVkkz@P|VsvYGujuWx(K6p7Y2;$_!GT5NhL{syqyQ<)Nh8%gSoaYO7M7!@sQm XD|Kf3qN-&u>SfyvZuY}y9F61O0`=q> diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/htmlserializer.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/htmlserializer.py deleted file mode 100644 index 11a932703..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/htmlserializer.py +++ /dev/null @@ -1,309 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip.vendor.six import text_type - -import gettext -_ = gettext.gettext - -try: - from functools import reduce -except ImportError: - pass - -from ..constants import voidElements, booleanAttributes, spaceCharacters -from ..constants import rcdataElements, entities, xmlEntities -from .. import utils -from xml.sax.saxutils import escape - -spaceCharacters = "".join(spaceCharacters) - -try: - from codecs import register_error, xmlcharrefreplace_errors -except ImportError: - unicode_encode_errors = "strict" -else: - unicode_encode_errors = "htmlentityreplace" - - 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 not v 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(unicode_encode_errors, htmlentityreplace_errors) - - del register_error - - -class HTMLSerializer(object): - - # attribute quoting options - quote_attr_values = False - 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 - inject_meta_charset = True - strip_whitespace = False - sanitize = False - - options = ("quote_attr_values", "quote_char", "use_best_quote_char", - "minimize_boolean_attributes", "use_trailing_solidus", - "space_before_trailing_solidus", "omit_optional_tags", - "strip_whitespace", "inject_meta_charset", "escape_lt_in_attrs", - "escape_rcdata", "resolve_entities", "sanitize") - - def __init__(self, **kwargs): - """Initialize HTMLSerializer. - - Keyword options (default given first unless specified) include: - - inject_meta_charset=True|False - Whether it insert a meta element to define the character set of the - document. - quote_attr_values=True|False - Whether to quote attribute values that don't require quoting - per HTML5 parsing rules. - quote_char=u'"'|u"'" - Use given quote character for attribute quoting. Default is to - use double quote unless attribute value contains a double quote, - in which case single quotes are used instead. - escape_lt_in_attrs=False|True - Whether to escape < in attribute values. - escape_rcdata=False|True - Whether to escape characters that need to be escaped within normal - elements within rcdata elements such as style. - resolve_entities=True|False - Whether to resolve named character entities that appear in the - source tree. The XML predefined entities < > & " ' - are unaffected by this setting. - strip_whitespace=False|True - Whether to remove semantically meaningless whitespace. (This - compresses all whitespace to a single space except within pre.) - minimize_boolean_attributes=True|False - Shortens boolean attributes to give just the attribute value, - for example <input disabled="disabled"> becomes <input disabled>. - use_trailing_solidus=False|True - 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/>. - space_before_trailing_solidus=True|False - Places a space immediately before the closing slash in a tag - using a trailing solidus. E.g. <hr />. Requires use_trailing_solidus. - sanitize=False|True - Strip all unsafe or unknown constructs from output. - See `html5lib user documentation`_ - omit_optional_tags=True|False - Omit start/end tags that are optional. - - .. _html5lib user documentation: http://code.google.com/p/html5lib/wiki/UserDocumentation - """ - 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, unicode_encode_errors) - 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): - 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) - # XXX: 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_namespace, 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 or not v: - quote_attr = True - else: - quote_attr = reduce(lambda x, y: x or (y in v), - spaceCharacters + ">\"'=", False) - 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 not key 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): - 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 - - -def SerializeError(Exception): - """Error in serialized tree""" - pass diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/htmlserializer.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/serializer/htmlserializer.pyc deleted file mode 100644 index 24726c14919a4a47ff6ba1a64e6f366ac3eeadb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11408 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 a@1q2(KjBPZ#!TUKVerC8p;(;$*Z%>GKNx8M diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/tokenizer.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/tokenizer.py deleted file mode 100644 index 797745787..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/tokenizer.py +++ /dev/null @@ -1,1731 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -try: - chr = unichr # flake8: noqa -except NameError: - pass - -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, encoding=None, parseMeta=True, useChardet=True, - lowercaseElementName=True, lowercaseAttrName=True, parser=None): - - self.stream = HTMLInputStream(stream, encoding, parseMeta, useChardet) - self.parser = parser - - # Perform case conversions? - self.lowercaseElementName = lowercaseElementName - self.lowercaseAttrName = lowercaseAttrName - - # 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): - if self.lowercaseElementName: - 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. - if self.lowercaseAttrName: - self.currentToken["data"][-1][0] = ( - self.currentToken["data"][-1][0].translate(asciiUpper2Lower)) - for name, value 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) - # Deal with null here rather than in the parser - nullCount = data.count("\u0000") - if nullCount > 0: - for i 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/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/tokenizer.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/tokenizer.pyc deleted file mode 100644 index dbbcf711b88234e9cdbae62bc8d75b374c7741c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56828 zcmeHw36NaJd0x-#Vu4*O?qjheNDdY}mY^1tC=oown*c<JAPCNq0tGDv&dz(gJHYJB zVh#|XM9UTx%eEw2RxC%7Rk17aA(!K`oO0~Mu~Tv!+lgaWBB$cSDVI`~OG&J9xnesv zknj8ccl6A>SuQ|GSjixPM$dcQ{rbKBkMIBgJ_i2#hLKNyHD4^d=)X1i_pz7ruDLGf zT!240S9NYN=T7F_V&0w1yTt)_a=_&-jJR;nom}Hi)V8?6aLAn*ag7IDE|;t2+>5N4 zch$9Sah*H4&gFsu7Yw@Uuv;8)Cr9k}8vS1HPOi7#L;5}HPL8_84esOyySi3aH@cG> z-Qp&9a+6!!>`rdBd+T&>i#xf+EpBxux7yWVUEStRZnNJbuDabV?r<k}*zfhOy3;L= zxsziq7mm4by?Y(6x61{iE*y7rITvhjA93z==iYnr1{Z8})03O<RVw^KlLJUv{8^f9 z)~oGSc&f6vRByCe>u@cooU1e|^;&B)eza?qay<x7RV%HqQK~j4@j+dS-!}-)w!;d4 z+BG)UTq>2rCl^YMQW?dg!fZ3FwJNPj*qqGcM{5*GsadX6j)pCk)01@Jg{7sianI5E zD`CSrIfSA?WxmpCwuX^i2+tq1Uwnl_&mOi0NAROnKNHrTzpxZGTO0VZH2-{Z#d^2{ zmmA?y6@6Sphr0X87kKLVXO14JEwx+ItwvZ{w0eWM@qD8as$G^)!<ARVMnZ6FQRE2{ z+%Mq;Lq|FT@qo^Pcay-9Kllk+{KybV4y1(vIyvM(R?Mtb;dLajkAOypU9d*iM_e$Z z%z78BRc6!$>y+8xf?;Jgx?n_^O)glk%w|#oo81yo0tgFKz$@Eaut}NiF4(Nh4i{`u zW~U3bDl_JSZOVY6wktF4f*s0$nszF4qYK8A+3kW|%G~6Fab<3H!41mX;({BMDY#&_ zGJ9NblQI)7xLKLKF1SURTU}64<~A4XQRa3ROek}Q3-&5A>4IC8xzh!=DYMT7w<~j( z3+_<nEiRZ;X37P3Dzo1O`;@uc1$Qa)Ru{ZQnYX!MN|}3HuwR+CyWnnR-r<6`Ds!(3 z-log}7u=)FeJ*&rGWWaS9m+i5f_s&D&;<vSd8Z5RQ|2KT+^@{TE_gthM_llrGLO38 zoyt7sf`^oO+yxIS^Mnf?QRYb(JgUq=7d)oSAs0NZ%wZQiq0GBn@T4+Nx!|BOM_h17 z8IaszWuA7yyOcTVf~S;u#sx=|Ip&JflTU+)+r!}K!t)E2W}#dyHJgQ2=}d@xsSy_H za|JP3<<&}UzCcFUKQdClfBOo}usXND+-@|$SK<y`FBG1tR|B-M5L!*-O05FhwxZPw zh1rmeEj8-pu-OcQ&K8@kQY-9es#Iu%b0Hp6W|L}pF>Ec=1OA!~3zgbAaDA|U|Ng>@ zFTU8(y{1??YVCNvQfr}Sb-jnj@`d{B>9E||uX1I|F8-y!dy@S9Dl#qSKA3YK%)1W` zxDO7x*9YAPojZjqYn8$EHOk=bkTQdmm@G5o=1~_Jl{~#p`Qi937~SrUI*6LqM&5lr z?@n)`6wl$_wB*sTNebrTM)ri_(cVkhrBb6AHd@<pwMrRUE;YkLRY|*JC48qX{*A|5 zt%k1h<qku(hb_v{uvsoGg@>!9dC5BvLF;h6-JrBI861>arD+a~)PROa54Vb~L9}tK zUJE7VeUh-^Z3y@xUqHI%)Tv6X(mHi&k{?-BNl8WaQ};2>^#BAS;jg!QCd8xJ&vsLq zCJ0-_ZTMN_OBc5ynZ#d9nhVGU56(b+EVO55PE=}-SLYgG;N@m3wV8wAY<qs@_yv$r z?NII9%su<>n>kvUooPbnO+llbDb0t?nWf6o%(<`@)EhGkt;OoSRg{R>A#Chlx=_3s z54#P2o9u}j*p(X|7`DH;QT<z{vgBXtt}?0VHDo|dAPOjNBck*3%$&}1%p2$3`2+en z;7$*^#(P{PPhx=z8He^bz=FDST1o_M1cUCtdva&@xD)4ZRK=WYw4%)EwQLi2Pr4Il zx4IKhFVmAGp!T02F`fr&zOn%JGR7*+SIUKj5_EE{88If={X|#@>IKk5q1|kks$k-X zeaXqKg+{$Szn}(08_hzg7O>S?;gt}roeK*klLiqh7RZH-u+?s;#Dz*&1ve)m<CTR< zd7-dW!gx3R2eknysw!6t&$qf-#CtS|Pns=?6n2{bwMjR}$s>mvje4U^Qf&b-2o&iT zY5SOnu{gk+39xvs9k#>bIIbCS^1Fp>q*+|gf-JpMUuqEu;NNOE*AlZ9Z^4CYM3FIv z0b-px^#J<OB=B-;Hw|pcZOZKfRh9|Ih^yX;zmjkN6<0u!uK~H_+-s0vAfP?2g*>k0 zd8H<LeN93SWC{WVRlT;xoxfjlFYnF_xyBOn;O8^L$`88J5P)k)<vFA7q}tgB+zE(} z0CWtY2x$sNK$CbBWakj20NeXF%;4wvYbH5|*<fXW0|b&E2Pq!_NCG@M07Qy%z()rF zjSldEwSSufIKsujfipQ*|1U&H$kg&KpKJbal^%6xz+P|90W)980~$FXtK<Ri&H-K} z54brGjFsG*%K>Ql_qL|@KAZ#O^6za=@BQ5zz?XLq4YmLW0oMT30MP)>0LuW#0L1{p z0KWjd0J#9R0J8wF0IdM3ZYM$lHUcUF9s&{q1_Js4?g8Qf)&a@^z5%iUrU9A(jsb!J zj-21iap6Ebm*@Ch*5`Nb!e(NA^cjud`<|#h?gpV;Xlwmw9<~<l03hvpZ5@kotN?;@ z?$IYuoEIL@g$LbZyfB6aXq$nWfSk?@xW=D)U4nS@C<3?(6oE=H(P5N~2tmZq*3**@ zgYMh^6NwPdT)S3o!SacuQL_+2afFS+3wIqpeE49Y-jKK{$M#KO7V0%9pgc;An20G9 zg0Ng!ELB+=)=DY<3B#iiHUW=He8T?1kyZgJw_XS;(6<eMq=|P<6e@F&a4MAwts`@V zTD=utH>4%KBayUU(m9y?zyt-^#DgXWWd^-(A{BKLFTHjraaRnFlHOJ*;VQE9ka7Ja zWcyYYt5(DLQgw<3;S%xF)LgwWRckMXjY@e+Cf<cainb|M_^BRm9;vn3)bA9o=OBG6 z?%$)aOMlGd(q`AD?ELdz`&HSJ6&9=z+f*nyD<5L=!%Tkv{~`HvCKR}pi<gjGVsi0P zjyWV3FXfp-a`Dmtb4V^;8e|U1#Y+$wmzZ3<G{hW|i<j0ihved=b<82Tcxjk9Bo{A@ zFo)#grS;4qxp--mIV2Y^ZD0<`#Y-ERLvr!bCgzY_#G65{pjYmX*i*b@o4Ws<?E=!y zk2duR=&asuO*O+snA_EQO}2WG-=fIxXgY`LieI!StwarEgD>TS;efmaZ(?AIG=PhH znMgUYiMdAoRj6?o-2B|-g@$z7drH-|DMO*Nc5OavP3noapp>pvnomK$Qm;YP15^gO z+9(B;^Fn3p5#V6?43q>KPOfR(i&TBOagMob0Lxkghvj;$2{Jv_UYrdZhv<vAa0Hi| zFC%e7Lpl3@I6pMFDR*OTLvGu^u7T0qNNy~*Hn$_U8=7*+@&mi^i~n!MHUIw|xv@OU z4h(EY{gK?h!BNy$pWBu%^Lz7?aww!@KaVSscExz%PmU^d9<mWib&zUyyd^c-d@1=2 z&lCRS+}r@gFmC|tIq6s6JLo*CcP1a>Jv0lIYgZ`&YhTPqzo0N#Y$*q|3%!l2)Vy9# zBrs8P4HWBkN&VlW`t4hm!gP&md_|8#C6EC7_<wnIv@wz6b9s40ZQ-{)%esdfv4CD5 zNoRnJv-b_K)F`_~%nL`yI`jq_9qIx4I}z&fYo6Z7Z^)MLk)W|)G~u!MJx0j#FLLJ( zC%wZL1S<JQIe48;!#U!WMe*hj=Z^DzGC#`MX70p=w>VaWGbOHwcPpSK{s6Lo+&n!u z20e!_2t9WZYK|rxib#7w<Jsu_S)SUDpBf4g+UzlDv#b|~k0*L@cCe$;FXUm3HjsjV z*5XS8D_{V=Gx@DApZ+F3vGU$XEc*p99<7~x=r}Q9W-Xw$<ddKix8Qr+$8Z0%%4fY0 zTvV4kl6=kgi8O$F)(iNJ15p9Tj^p|F4LnqPnDEiqr?E5uZx&ER4IgV8GhH+VoFSTG z*Q1_bRHi5CC_E-<eR~C26WkB!!d^)COP7>Auk^*fDsv1q!}CjUCWJv>Etxd`&Nl7G z8m#mnQl-6GK@WVm&F-ZQdo`p%+w@~jcRFI#$0uXlVqRGP9VU07j+Bf9c5#qDsbz{c zGP#=xpIW>ViPX&V4VXieYNn*_V{R`KO1UD<;No3K<OC2hfb&;AR2s(%rRJ$K;f3ZY z>b+AyJaf<`)cMeSFtuCpCCEuvMQ!TAr^5>}+KSYBMY=4CyODUxicgMI6kk=|3uwJX z`Z+4IaB|B_0W}NvZt?9XEKLZECQWGYMg9<4N%r$-2-m}cRGJ_can-fbW7O%99y=rr z_WiifoI~RBL;0<_JE4`v@|*KRxt+Pq&{yLFJMnvaZtDQ`(9Yb>b=z{ga)Y@Wh6Yel zS}H$^f5&ngRbw;qD3u>UdPCmoY(r}|qZBlw*^0Cm`R%30Za~Il0c0-q5d<|=S)PHC z=}8h%`v?+Y>&QzN`QObaSPKE4fguYM_PLMLlCcsnk(X&Ag~G*0&|2|PB**0UFCOCW z`;pjBViuLTR%1jqihLn9M&28J8TXp}er}*lq{J*gkv`>@kg-qsnte)mc<?Q0as8rh zK<+&hedBT1&fr1FSNrA<Q61pxvkHu&0XI(Jj%v6D+qm%|H82#bQWT-K$(h9re-RqW zMNL3=G=9Esaad(h@v}eg&i*1j0qnC{#>3bSf5%=;XzS@o3X%5DAn}O+hDfO}AJ%9$ z6c*qfs=~-39RU8eTINN93#v5VOzk8f*Jfh1&^sjO5?x0Vv@0gy{4LW*1Y4}sx`S>k z{X-H1k(K7)1i?ea#du^B#lu?Co}Sy`DdNb`qLMvBsobXAIaCXtFU_Ym4&N>{vLu*G zv9xJURcesr!4%%3P1!`x=9ATW6YtmF9sQmv+l8q)_*<vyNrhwjaFTFEiX*u=O%63m zwPqFG*CHXgiCYO?isqu^IK5OULkO<xy{{El(7NOoe$tB%{3)(ADL~ws;r!;@aPEfO zb^-2<O1DE8iA$&g_~peV^r#t^7-UX(g#^D(x8Qt-dmXR?jvYxP-a4dP=BCH3Kh`b4 zK-~I_Zml5|6K5g@*Xd4*iP|qg)If(5P($QisC}GG(pR<4HNN05P}BTvfcMXO9x-eU zph)yK>sc1M5^k@tq)qtK3~0g8Ga`7YmjkR%I~#R{EqPVZ()1)rE&?%9^@d;iTln<3 z!#z-{R)W;R?<DmUL1cjp1#I=G+x-Vl${1zqW(*RZn7BU(zLkiVUsX^6yz(r(&2}{< zYrc!&5up$<CwY&yXY&O*f=vsMTI6vRMxk5~^{d!5qJFXD|3SZ+w<B?IypAS+sbr~s zNArWZ(ZR9Yo;6$Xdy`RqtRuQq?dxcRbRpU~1(KzzW!Ym=xTX>lF<_sCx38rmy7+E% zU>ADPBr7{`I9$){)Ypx>G3?~-7Z@QUD}q<~`wL>JwbW7M_Thfq?w5$U9ff0V|Dd?t z=Wf5k$Ypc4=5D~j&T;iyT86u+6uy4k&2fQ8?oDtxMLXF}6G4h`$o5FBSSD8*!_z=& z==V{?exC;rn6Au6yie{nlVdM)Qf`t0<o)7NCc=H}sYtu{40FejTq8z@KR$jPiLaYT z?>#(EPM2dye1A20{yDzC0#y1i*PQ2{MSmXb!}AI5{cRMAv>Yu5x12`*Ay1>frdkRs zk&$8F1NIV~LNOx{l(>id5&*X<0T>&Vs68b{UMtz~3F`0Zs54;pVNc~|G!v`bs43`g z1G~nQS6A6a>?lmvp<2ZescNOzZ<JnX!KCfwD3L}NGo@U%DmjWmE_xra)T1P)-ME;l zQBQ@!22PYGzu0vm!$(*-qFX7E(IeC>H!4dl;<s-JIwK@aUrD6)+=@w!c6{Oz`2v3Q z$}_qnfj({#SR)#NWsl#D9w7!dCIs05h$$KvvF+hYA9!F@0)|RdqIOSDGf^RmD6=3? zTK4%^T#2Gi(;Q4(T`j91rlDbc2G5<CikU9?lS&<a#Z-@9D;2&Gy}<lX#L^%_MF)hb z&7HU`k>hLc{1`$-Lb2?7B5ZyH6?!Qk8u2b0wUHw+7;$vjs3&-fC>9=|Pr3>wQ=~eM zl`#02HAF>5n-##6|6tMs9(~IE+{5e!E#Xl;1u+?r+@Gs&BknXJnWi_1R;f2(WO{nj zFEJXGKn%t!fq1?(|I<>-8`b<nGEMx-ar2m$>Qx3+ZeX>T!Zp>6eSNua{}3$j8t@+x z_YbiguSEAF;{IaV^YkRAi5cbZkv_d!@o5ZrqZRviI-NfpUIN!1M-DNp=h%6?e5O`^ zr5XnFVW5^D=?)LvfeMN99_H>8ol8@2PfyL)TT_k7{6cGL7O?pYCPa~MJe!+z_Ru40 z_R;q8?P%%~<{3;amKtZ;L<l|4G$3Jf2~!9`+^#xH2SZE%ZD_VaYLXK~Xci&;Rw2Gs zdW)u=xuayG?`BCVaJ(bE>f$B~5u~0f1{T!ZY<<4ne6qgCdD&J{Aa+$qh2qobWrK3y z05U1`pe4T%|F1>B7kRnaCz9Oe+@|Qt=GfZh+a#KTSOy$)8h<?G8wIYWT?KPS74Wr* zezIW2@!(ZBH^~3wKg3YcfXy<+yqK?w7qN-~to}*eTF1#cWOX^K)ELABIX>n+Ot(Qp zsQgm`!<ZWdAC}39tje;PlgfSxvN|RuQj%mff7I&_9N1oeFvSNIIB^TFi5w!K$pi3q z;M`PFKy0YD2p3IHQd}SFcFeAjaq;<G4|DFr#e`8}*DRSdn?DP0R6MNDWis*I?LBW) zmBw?&tQngUl5ncU!DIj={8oG~S~VLmRkSn;%y&j^E1qPsikRy~^ykxLF6n%^#&*CJ zOy(lCkN*W@ft}W3-bDvHC2IGt(F|E3lbuZMDsX*j(A9oRgk~7*N!7xnFfexQXT<?v zA8^38>xS=*$p&Y}K4=wa4&-aR2U8Ut!F&eLDsG+7Ei*IWe8#P;cEOe&=mS#>E3OUS zFXP&nSAcrSRXht<5##h7y*>2I&m(>y!UZuhBoXVJ)U``ixLfMLNmXRq3<`q80FRvK z0X#j2gf<%@j1wkNyj1YZ`aHr~RBE0c5CyYpi;1U7V{L5eU^i>sk0cFj$m4U3kfJ#4 zr%ARG=u@f_Hh5$klkU#^wv32h8`U_X_~Xg{2q$6!rUf$0Czw#~BdX#D0J7a4XcQnY zm70bHp;G9jVBE;S&)w{VVSf*1Bt%2Hcqkzg1r*XT*YdGe$Yo=t#)T)^b6Ayuc_*<8 z%pzqeI>_=qNFF_hDywN=kE1_d<iIj&Wdl2$+mxT^BX>T4LcPNnsc}qPg=K(nEx9!h ze9Mv+hFarlHke6V7VIBQ>xY5oYf#j|_@#qs5(gH+dJHD<#IbH2lZ>Dc<K5{H5|5=r zXe#6-T<aOQF2+r@iP&{j4&3|k9{;*?;4sbIA2<rHb@;1@%BN7&2ChCCW%&J#8F>R! z+r^l`QuIpVik4bHQP5KlL}kX=M>#Z&j|#BCM2nP!HGl>a%w`5VuAj2!f<KWTcD1!R zG#2TNFR8IFU3Oze5@_sK*fW@e1b}zZ?n6o_c{x2pGy;UrH!zzC&6f4Tn4ku0^ayVa z;`881AnLrUnd!QbbM7Lel7S2QF(h|Tbj+t`d`8TO#{!pVzQC5~OSHCvo~a#<iD0E~ zXjFJX_XOKz+G3PfrpHVXdNR!zVNwf)cB7cWf?6U~B>j6lLEiDqnD_Cggx3sn(qL3n z#ycrrbg=|UP3{au1u#vwQD16Q7`11Z;#w&!ke>TPvdBHixZGVpS6gAgj0kV_=0=3R zw!+cT4|RRBD=`f|CN?H+<`t{0Y1COwYO9F;{8gv)`x~IPdPZ&qdTX_f+$=_plfgW| zab0g+*IU{^q1~;wiZ6p$uBOULxgk+m#S))!E%j6x9avA6xLSJZ7tkO94gRd$*!lp$ z7+?&s6xK7Mu5Wl{PZKj#2a~_oQj049=X;CN&}s&_2Vx_*XBef!QX|6Ivpm}0lc4>` z!P|xT1@{SP(ty_rlwON|VXubPh|5AZ^IY)f1(aD$I`Mh*=MIt))kI>-!9s^K$+rv0 zWQ2XP3%*4Rx~vgifpT1JLl|IK?&T1s*7$YhcwISugOp>+4Xa2w&VeN!BTHN@<yb|7 zeU+m{ZM4jvwml+Gu^ZfCHL($|Kos^jsqK#2!kWU=XJvX3%j38vz<gHJWmA218RapJ ze47WKMm_f8dO91h#WhozYUyC9xnQbE#`~(&Pa!%#!;z#n-SiVRQ+9ykTWypAj?g#5 zC}Em~n_Fg-C>j#<umx0o^?2!@34z*F=6SWNg}P+3AJ;95Ho@r!80qsUr#jOA)*0#b zOT=89hI4DvY?5mjfOr2uO<LFhPfL~}VDYWL6d|KUv;p5<;_wrWrPJ7O>>D$@q1GrG zMQ@<DzJ_9;H#o%sz+~lg`GHNooU%41yYO$90Lj9&BF$8Iv?lO?ZXpx&PJCl$Z2`_v z<`k@A-_mJK*K~R^L2%Do=q;B>-F(SJ1_2|-(JReUhE(z<SE6`I@!PH{#ecCs#ec!0 z_}{!L6i=>+6;thqsNZHueOb+$QytX5zvpSOm%md7#%+n_&5^w_C3odCzbtVV7cfxf zyoTlLif5RlRJw|ysTK6>Bg<2vO$DIc7OfrWpu&U8QQ>3##t-qCI51H|!~?%f*1k^_ z5=iqEkMeB2Sccp~1Sf8bbd?BdBU_8e{EwcFq=6E@a#r)&)+U)26O&p8*=~(y-{JXG z5m!XES177&R$9+A(&YvA^295W6?hX2U%kXjF8d6LH(l&;TO>d=9V}Yzu{;6)8X6(p z;LplERNp0;WpPMb5#dLZ)2RWV?6G8Sq+*!}+wp0p;1hRMcI~95bq``O#r5$N7p*wF z(uoBdD3?-*FAr4#*Lt*7rlU&p4!g8^XYGUa_G~pgl<Bh)S*;>TNUHxC5)*@rzR&7* ztdZ^SwQ8eqFZo2%5Z=xaqfl7I6A%h`fj;BC0=Ly_8^tQ#=2tn2soSb+^au>E&qaVl z!E}XXW=Z@_n2S(+8MJUUV>&4}q~=G7&$yN`of<muTV#nh>9$HHQ2z%sm?`pXYB3yB zPjI@*t19F#p^5aO!My}gX-4MjT2es+_>8KVejIUU|DArCwi|J^87W@u8i@y(_5Fqq z7$hXrG%!rHPMl;Nt03a$HMg0<A&&jfis+frLZ3tDd>Cp%lcDKK!Dv2A_vB$#F203H zr{**=d>J=dyOE?4+1H^#Y8#tPAr&ka+bYtei|GHK_?mPl;yyc|LuuJg<hJ(lvt`fA zhm0asT(&n9^XL<+;=4sdS=b(HR=pYXiRthQs%$=<KkBJ`MLwQWB3$$FjLTf``x7_W zX=@l0z@V7u=|is_tQn^3@#(+r{+_n>*RnayMyH(J9ML~};6chxB5xINw-0G|dL&zu z{Yx(A09r+CP{$kmCE4IsWPAsYZ<}BX3Y%>Y^SVrFg9@pO=frZx^<}dJ<~v?FOZ<+< z5?}2h$C!RE$L&cKl33G_`f!1o6X>=Tvd5cq6J2{&S=I_~k!qG<l}>gko<->*DQ<PT znU>JAVPGO}t%-4g&kO0AlYY*o?^=!@R^)6t=<$FV?!Fj~ee<1aA#q0;1NC$L$CdlI zql|&f9o4G<-n2W)XQ21=Fi_ll)(WvJby$&nuRzyaiNk7Hjk7Ep8Dpf*tkugR4Sdc5 zS%l!w)CHYcSHdRQK8XlPz0f1PW5P{+vhc>zYoRn<<CtJ)NbS@SWgum(t#Bb8jj=QR z-QGm-UewI@>{{EB1&X^u%|0H6TgpSk!oeEgRfGa4m>=M<rVfb-Ig~nr&DU)!JGV+x z=)R7&m03*^2O^YJX+JeVG6zXAu_tm_`zaxvpUqT`ktgzP;(8!1ZPCk3Eb}f`dzIQS zT23>k5>Q@TizAB}6HeyS#UcjPuq5S>RH)6)v>h%Hn1;lvy+t={kL%B=HM6TxXNzua zmf8Lny5(<6%w73LZ2dAkQt`x=6?6q200=F317IOOC8d|uEVfU`Y8EF)^m#)py1{3` z#tK-C`nUQvi;We$W;gMzxT@&(6@EvI!Sp13@3!bh>uT`Jwmdc^X)c626r`L``fwDm zq-^!V^NDQTi|a|8KHdb3)>*PSrglA0EB%(7g7UNl8QV&hWOvq2R%K<L-*R(<P&$ zU7H-(_Qpq1RzZ4O%0qXDZEw64x#U4z&S$OvnPE}(%hn0;D=6;2N|vT_$<p)qeBO2i zJE6jFP)MH(RO8UTUEwP0G`A^#14_sSq*P)^N7G_I42uw?h44fYp8`)~B^<nM+!7oN zU@j6nuP9mM_(}0Lz$!dt7t{h4!kMb)z9ZVWTfqsojPpM*MGVZ22_#(IjHa=?>=|*b zMP|R3x4EnM{c2Ym%{P8h?V25ib(J@%yy4^D&@B@HxRuu}L%%y?mcjuJcnz>2;c2wP zJoYh&1wc=KvB5#wxu4UkZ`J!P^lcGLx?GF+dTERA7u#cpcCh`A^=%Q`p?ED~J)MA3 zZBO4%oIC)ta~j{KP3E__#u{ZhUU3|I+hZ4dygtXf;}&-sKL2v(^}@lIp5ZJuoL#^J z0=lb=V@rC<#j$u>`<}0jZCj!@IevC5k3T1{9edQn?Gou{zb%gkW8kN?fX|TK!^u2% z?a0m<1ieD5Cm@}OD2lv9M8)Ts#3zwRF!^%ip*Gn)DZh+J+ktY?Li<F9n6TT1J3)J? zS}9{0U@8gIX-gds)E@Mn2a8xz`ysXn8@iU+r<-NlY!Bgy-K-%Yr<bO;OuHaI9&b>b zinbXRl|Z|bIXTY~sb&YOy^A*}4YUMO$A+cznsk0=H7uRO*2diDS!ft;6nqM7`};hP z;e?*C-R-sV61&W{L;BXP!GR#f79QK6eB}B7nm9cD!=&Oa?0r6rtyu9_QZkm5H}WcW zQ(uoQpOoXy6!{x-LpU*HIRDn%&A3iEx(@rKM;jM+c+h_5@<Gw3C8~V4bK(FHUINpQ zufmAsUMKV^NhsQhSq6PDy$|7z(~ylat2`iOG7(m{;UyEV|4^;jvR~XXykwFTyGVhz zH#oEviA#Fh?3gV)BN3O$6M>~5;Ip1+c*$T`xo@)&$XU(ye-Xn=COChjZ?h1^Ub7}R z@v4TGlFs*iiiej7HVg?plE@<3ye5X?4K>I|Ss3YZ1<>tir&j=pqf=pGl7`#hCy*(` z4&-o>`<vJhE`k27pPf>Nz4D|EnKs>QwaB+K2_qboiW!Lw@>MYvC7n`am0+WD=;Ke4 z_a8*Y+#AG3<Z~h;!$C3Er>H2+dHAS<!@qL*9R73tIoz1vIQ*4}!@+)-)kP-6pTzf3 zJFQmC4*HaCC-ItRb<6bc@9I{vZ5sBG;UNInFAa;)$i*?*+2ABewyUb|2+yht4)>}? z2#Tk&jM~mM8whLI<0Pc@Pb7$N%pKt1YvR$Yb^!^NYuDgXN4tRsntr8kyEwGRYd7Kj zJM?XOy5IX4G5>ZDjzJJJhHSHQW262X@a#vegeOyEAVrwiF`c`=k@;kgQPA`;lMMT? zKnHe-4K&_(xjlgthhgHlIoe?D+SzuUN78ilqJ1li#pl&@-AuaJAv-!ABP+76>}XLa zC5;NOm<#PWbtd(nwQlSw_(IJuME_bwYtz6U)zB}v7X{O$BDQtIZeB~E%_<Q}6sx~Y zp~T}&I)&0`Zd)Xt2ruH@g>FntxHLyN;?0ar<`!K<labKqomjX}w=@@!yD$E}xYNYW zVco)dAM>%+>^u=)&a7lLETjuT0_`fAdeL513*uHt7nnG|r{`p~g(!iyP}a;lbn-4$ z&?;KLX>e=wny8196fotHCJ#?S;QYc~j=fylAZEu5mLsM0fPQ1`KyweL#B!<9^(BYv zJ|Kbqwoarjc1c;Jco-$R@p>m^r%HR3&^VXX{x{Ni0U4uls#&_9N!d3?|8C0f0>zgp zx2RsPQ*jm*o31gv^Npcmo>@~3yQ#RNA6-;j{5A}qVa0DkYJClzzj)cyx)HVHEL#Nq z_R3s1FbI20=4vV~_Xd2_LxCo95%x8IcWtlknLNhK9RMjDp-V$=L^sUq^i#UwZz$;b zvApy30M-ne@ub1X?*<83`==86wtufJP{?WvX47(Q;f!Opr9BX_{Dp%39fDz5Z2{hS zZJD)+FLAG4B&(azx7;8vom^A+mO2cWBAy%irl8E&!aUa|W{pfcu!@$QW?5x##Spe} zo_KU>U)lHc^aV~Cnt=kW4`fS#S^-7+XpLIkc&(|mvT{fDeHU%xts*OXb#*P%BTmP$ z$Fj2VsM<Ubm8E4EDYn&a6xpd)=vw)AKrL<y#>5L@$Eqd<P_ep+|J{_|gFUbkwZj1w zBYzE<i1<A4l+DP$CO*p8RrJR_R0Zd*xELv!|6>9|@JEARjE|EIb-@Se0*<aF80%Rr zw%8K>u`Nfk8i0w{xifZ01F<O5W}?)%hLz&rPd^97ttjcS%AscuPj!1E1c6fD$iB`R zDRX7k)9$|A_C!jeqRtt#n7N^-g75@VtBEkF68DiXCy+@okROu4uF=?TZGE53CVvCf zddV>gyxdC<Iqzck$h?!;jrc0Hg;5zie4w%qM+69yoNhe8=)P12KSD}n2EW(G8{1^9 z6zZX}js}cOanKpv_&$}<PvmX;+E+AF5@pg`vyLOn+Oloo<x0toPARWKH@S6I>xM7# zx9>&^W;e=Y?2?5kjVY2((p)8An{4q235_pcgtozqM|iN8C$TarkcjX{Aw5VLJClbC zHSlME!8w0FOj401s_9HTP)wJoF~q_q%?X4UANPPr*NVk6u?FyDo;jtEqwNH*vFw<K z;cW-O&;|}YfG<D9kqzar+aRL)NzX%EO>*EQdUl+{L%`?;w_<z6;oSHj<$zQWZt1{q zsh}sIRFeUD-Hr)|sjI=^e(MYZoa1i{kY7&fp`+B-avUp2hfa=1C8#1+jROq$s?)Vs zB3wEi+$`8SnZsp-W6vLV!7VN*xL}V9CS0)B1-H7nA$Rbl15qHje@775JF^y1P0AfK zb^Pp)Is7@nh$K3P9c|IM9q<xx4|vejPW%HG*qHsZ%g(qMw~g<u$0n5!GiHzfdGb|m z&{z4I04TfxcF=bG6T6xsjDZL8mDlTxaZSw_#{t;sC4><Wh5VZL(r}qVTHfe5VFT$6 zZhqx2jix@Ai(mS4xwD_kMK8?<#(qe>gbnr<j%GAkyQ2?sQ^Hy23w+bY+Z0ko16wux zz{Pd|`q`}rq2ls(z7AZ*Y<KcD(A2T??CPm(HX}Wz0+dM6PO&&Bd|6letkSa5CzZC8 zKCkqG()TJ|QhHozsPvE?d$3+kn7YQJRjCe^utu{|J`(6h^Fk9_OXCOmyIgNHaEP`V zc%Rb8yOjiYaY#UWfQ?1M=2X2g71)C$l~pl%oAg5TO6i5@z0wQO%cU2hH%u=?ubEzm z-nBb~t00M@BD>LDJ4GWo@uCqOdm&Yl1bcP-wocKAUd5b1oS~wCYO4{3x?RVinTM(& zkI!f-@XGJn<RRdS%?9CIsa<U`;%gTf=h4Y~)A+JDC&b#_i>r3nH_1gu1=yjIbl%#L z*&L9?QmecW2B7Ekt5e!ui(u{vJQm{1HH++kHmc?E*Yt(1#lH;fZqxDBL%DVM#nU=A zN)_@hwi3(ThO4)DB~XtDEYA~ZJ%1`?vgGmGGHv?^gPCog_)`Zw`@JUNlCeyTlFmct zLQ(RSu9Zn`W`(WTfvFC@&T0dJORo);V9~XSm0<Jc;6ANWSa690z~Dy7z^wLQeXOv( zThynd*JvCzIiGE^858}ulOf68%!+7RmTnH__mxn{j*IfPVj(d~plo_1I;|iQ5ID6~ z=f||ERwKhYy41A^jJ7+EZh`U}ILWMIw<z&JC%YPwAPf}0rIoRzGuc(#f9-AGZ%0=? zPIeGKDohYZGa2WkX|XK{9w3)zctM~8Fe5#j=HAO7a$AmIK;%k^{EJfESC7b>SDDE7 zb`m+b9dyq4!q<<`N%2#}!*7n#H=&t`SUabwFH7Ua??JWIMAzSq{`~#Rq3bc9u4PiZ zoOjKypcxJs{&@bJY~lS&qRBT$*G7k+YY5x^!W*!1d0}f2eF*O^Is_3$Zv%O)^GX%- zqQIr3x~c*<L#R?@h&;2m+QKA4pY~QDW7+BM9klq6YcE&H55GeCyBV3(bwhdT$yF>V z_JUVyP*RZLFOXR&)tMwTs(V$nvefgkkb#d%)V(hWf2VJIZ%Bc$GVi9qPDvO)RVsfN zZ+%rLFp-4bg5OA_O>uS;@qU+rFMbRUH&=F+oa1PwvjA3;oclO>_OD211!OwutW$4y z$hU;jequSj{ji2#3k^vka1KTXaKv_hZO+51pGZs75Cy>NbQ{E#F+*U;V*A3YDe+-a z9i~{r17T|2h%Z^@=(X30U6a{Me<=BjL)PIPFrb=M8RmV5?2I~NFtqk*;Q+J&`TKr> z-K;iX*?Vm)_kj-e{V1J>W2PSkK7|x17=OSbr-Y_v_C4)a8p&;Q^rsT2u&2#<jOX{9 zE!E~D&wMl)fegc$KoJu~BD|}b3YlZRPc<3cw*Ee5N3Ud?x4mxA{pvrIa(!y5n{QKY z-HrR6`%ZQ<`L;`|Jb||}<5kLI6+v-|pg$%nA3(-fxr2oxIGzE|b#7!fgWvP!7#xe9 zz>ub0&P3V(d@XZxFgDzh$$F-XY-aF3?xcJvjB(D-p;OG8Pz%bB+8d7BOE}tek#Xbt zPHyztQ{XF^kGLE+8X8KU2%lieYw=UN%un++Po++-0SwO6lpO<mxh%*Du&7IveiO2t zHm7uxn6KHwjQ<r=I#qy8!B5rHDkAGopnDfd)~SVQWSvFaxCUp6XJJy83lse|GSn5F zNIW~TiqjNreITUxM^(!YKlL7(2JZ%&1|hAnIGBptrC4nt0%{>xi<)LN*tvop4I+e< z2E+!U1{5`=fnlexWlbvBgS)AB(tMJg$NqwHQi}9_p1V-B7Gkod+;)i=m;W>?K&rEh zY;{QFWldLk$h9abnMzrSRjyen?q<TrnFDYYQQUW+Q#+vKyl7S|G&j(ju}r`;do!Pi z%5ILAidoDa$9-Uob;es1(~4K5L&8J{b7FZK3(4Ch+h4`)QcPK<<go<v*ClLiu^D0$ zeHw@4iyDtkOGD!$Mz#jJ(URgj5M+cg6B3+R-2@c6l5UQ(o6%c!Js7U8Y00e^r;vKG zDEuy5U!KDIOl|gQ9jXn8A>02)DNQj;`Js@(ig>C!sLR^jVZturCzF`V-1szQA92nq zVvFxZPj4q%>_^7%#Xy89#1=`ulUb4|BLP?<j+^-SqyhZ#93v5<yelGJ7<=O|8xZaV zts6b#lK4P;!9%1cJrlx~BOs>Nzn*5RSW_|o7}cYx|0Mpg8OQ%w&r9aEfYjsTbRea@ zS;Bgl;LN%he%QnVv<Hg@Y6OQEf{SLvMOp2^8j0G&lF;ZSBeuBWH`x|9l=CLuY2F&; zuXo%bSs;#w_v5u}2H{9{ILPUIi2z9yJF>+=9>--)0^5yx#dk4bNqNd;1!Sv}RFg<` zNS%BiD~nsiTdRm=*t5sTGPHG!Wp0u;{H9K?c)~im4j*}$1H(^D#3%gn*UK>sG|QL7 z2mbQCL{*4=M1Kj_{5VS^o<`FAWkzR6cyRJW^LX$BT;XF6upyNc_#oRVU+!TKsB5<< zs()t=GM-WWCwfBqYY@`EOCkLpxe&$izs#O0j{jwM_RAK>|EyjN+ZqC0VK){iklK>? z_%=Q7v)=P=cflPlm~_FNF4*Vh-uQXX<>Kc(mpl8Mh0yJJ;?($gi6qPTW(r3o-^@bl z(ZTa@0br_w43C}xux%CWeI}{wVuk2&Q{RY|=Q)iyF~xeMD?d!$mNEW<(pjZXD6J|z zs<fi?h*Ccc-_(_9rG6OR56{P8cs_SgC7)^ULq1X7hBFa6?@-t@+~dBlLvc!)bEQTz zjd}M3!J{`xOGK}eUWnc)y%4=vdZ8y6AH8B)q9+*NQ=%t+A4lh@|MUf-?~o}CQ~4&j zC?S{PXvw#`(T>?`lyurA$QPK$HLv06@WLzghHVqnQ)F7R9Xg6o$j{d2+s#Pq%EjTu z;-BF|Kg#60kjNBM(p<pL;K7;sN^7A#J9DB^d%QZ=2m>!STdB<)3}@T(GsiEq7V5P_ zwR1D~?7wg3Xk~V$S;5kD%o;dTnh%>ZOO>UWbMUa%8#4>7#p=CPlxT4=cjeWvv4818 z@soJidnr%jmDHm-LJ+eAHz2?s#T)aZ3dA$u&Kv{r49{m?9b&Du2;>8(<Ry1IfXZLu zkra;j(+gDgMS7OP2eWH`Q-a6#h_F?Z{xYL%!HISO;C)dWHHOVAAfhd9j$@ipE~_zF z1|~y<V=%!84iZ5m6=yx{X&gCTlc~Geds=mvm{h1Hb!<NSL|=K+$MF{PZ-Nvu<dP@O zQXY$*muYTJpjRE{rjh%R025IvbCs}RzB#c>%1eR?;+qsE>_$swf370H@cro2$4TIP z&rWx|5i<$gjL?pav=UrB{{}F@b}=%TaG3g@1Ol8nU^JsyZrA`V+SA0A^45CG8IVA^ zzY@ut%kE#QF@FKZ5T=qvE<5aVLMp^|t<e)BjH}{yDW+0$m7sB)eE}B0K1V<)!1?HD zR^y=fD{1_leR~V{e7^<_XJF#sMi{F8GCvMi=d?0vJfr0Pi*!k*p36E~I^V-M9+&uY zP2zIP^Izsp%)9Ym?KK;<(al8%wTjSR+$uYjBEL_KH(U-Y-6ee{9{k&AYBdGIegOUX z5pv!;kV&oE4N@VNCcFnllH}zK%C>Q{ok1{88DTQjk<8q(oi8ps_`lX%>9Rd*zbjsZ z#z6DNi&>%Ebfy*Xzws1SM@eI3Oye@IHf90{RD*j{Ud(Ddjci?3<7Tfym)ZM(>$%Q~ zK`Wof$WfQ;F;A4wI@C?3e8%1#w)jYUc`jU@`MSL9tvzV57mck%J&`4~;f^UKG07^@ zOrJ*gewF;O51CHQ6i-O#^a9aQ>P=2aG}LvjkUw_?EVmM_Fb%WHxuW=YNZVPMY?TxJ z52D|Ha5acNdk5$2=+jBhlk=h^bb{o&r`N*fu-%kQas0isG@Ui@EcV(Q5V4WakIV!C zGFmTic_LP8>f_I@q@^Up<>R&^!flD^;`PZ>M1oa}aztFQ+zT6S%W5#4qy(pHr)D#M z4P41wyE}?ejr}Rq0B_#1K_iC#l63@Z_l_*E=Bbk`2S95I6=%cND`8kWXb}O!W{+df z-)NCSZ0gvyXWe`ymJ-gQ)#HP_?)p6-Z@I#~_%1c2RvVV1xcM5{Hk}DUM}WBr47sH- ziZmC8_Oj93{TNab75?-(0^oqPxkoE?z<yQCW^CIcpR#EX@Sq_vi|HYT@armP_SNTm z%NaaFIb%7Sy!5}+SQ4>=eUxE`$rZpSCb0&%c&!t$9hP{Djpec$^lY#02F+B03zMc& zFUw(wGFgUHl@;;Ja2_Ps&f}?mvw$M2CDRy6{RAoRNLhUreJOs9iD+G31er0bjo?3n zKCVZoper;N`^8A&T_(&jX3KStSF)vVKVn?o;!eHo8AR*R>J@sty2bc6x5w*KAl=(Y zy4O8k*UsaGIUy_Zc%@=|qK$FO6yQWY{XJeQ<s6SqGEh{e7?<#t$d>Sy+)hP%D!f;( z59){T=^h|2T=zlwO9{WFd{Bvn@Qw39tz2P<g}NNItH=jM=6(<PV;?fteNaH_+(hx3 zduFeK59;gB6~)hkWV&r-DTP%|^weXut3mYt5e<Q4PWLlle_5vHN)6bLv2-+p=qEc3 zPWX5-X0lq~Pd=K?nXDPpllJ#*5I&-4&M9BTJWkOx8G86*w@yFco&m_O#EN88qI;*P z6l#c|gfav~*cY3xu_|rH&!c<aN%|@vlLo$gXG!cB@#fWYj)dl=eF&Les)~YKZ@dBw zv*AHTwjr5Kh{mvXOo&)+K?eL=+}nqpiALVruZO`(Z}M%{sAx*SDpGLtD}0t?u@xB` z3yp);d2Sjg6I;WtrN8?6FXPI*<NiqJf7G?GHPJud_k@FrL!vK-k$^u(E}gC$+Ve5? z^`NXa@51al?2dyOw+te_j2&|TzO)e&em5IDF6F~$9DZW+EZ+idWXaEa*9vy~A=R~K z+V+xY>jYd;@bjVs9vtoS1mi<~ZJz3anFyGaIOrO;<<1}A;Nl8O9(-w%=Y8;{uzhzf zo{H!lpfqaJ3(o!tW(DGzh(khBU~h5l9aRH~V*i@saz*<MY}5|H2iW1L0T#tm%z3qu zpVVJC_mbvsJz_iZUc7YaQk$gr(o1FxadcdTN#Ch5E1XM9k?~}_6=c(_9g?YSjL1f8 zzg>|y3&Y9g+~dt=*x=?WhZ>D~qj(pulUmC4cCDpc1B=(9eXFGU$h_&AH|_nHE`2Vt zbqoR2PrF)uQjPExE4+R!wqE&8JoYEZ9o#h2VNMq|vBLlKZVl$QVn4;L_;*X*4qV=b z5dEgy4wM?h1}vkwW0TLK5)>9d(<#pAKXnSxZ2nlR2kk0<(&jvM3ZBAKr?d}_rY97+ z0K0exllz!Rh96??Fq0!pB<tVJ+;dF$pyD)>7nr<<$<s_;Wb$4n$C<pJ$tfm9CbLY+ zOrB>FFqvZ#G69!6JI0L^R$O3mnn{%j$kr7XnbesqF=;S4%cRLfI~jtWUGW?fl5Ft< zOt|-K5k&873*8y!PBJ;c<lC8iH<RyS@^K~~WAX_m-@)X2nS37;&d)1;Ka(F|@@XbN z$V36a&oK8XCNy-5MDyld{XBE>sd9)@@>1>_JHv1@I>6y<vfD%Jhp;Wr)@{R^ho9PX ze0a_9j^Ue-^6yssziD{y@UG#V!|U<??kL@;{K)Xg@OJ#a6J>aBGir_vk0ZZ%_~zmJ zh6}?J!`txxILfe{Dcl`HZrkuJ_;<_j4Y>1m+`9?w??R0mlKi&ejmIW$MBgIfoolz+ z4G=FW$Q8++MT#WIX-J`3rM%E6GNL3l=F$?02F$FWRH#;MFQ#UZwy27f>oqJM#GX!e zWErK0omNKPD3W=K6bPO_oGzgv@sJv=)Rx-V5ULTD7K;=~(WX(Au(*lk9^fT*tv-7i w&o1(7U(4Z^IC#hez$5&4+HPTYejqmjhxuTBGZgP;Y`CzS`!(@bestjf1FMWJr~m)} diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/__init__.py deleted file mode 100644 index 6a6b2a4c4..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/__init__.py +++ /dev/null @@ -1,76 +0,0 @@ -"""A collection of modules for building different kinds of tree 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 tree with built-in support - - 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. - - 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.""" - - 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/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/__init__.pyc deleted file mode 100644 index f7c96a7741af700b586386fa01c3d07ffe8c00fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3457 zcmc&$L2n~96n2s}ZD+f%(h4phWK|$iDUHMeLaJ7X(pKz>-Gb5rqKY&)Gfv{xGtSzc zbc@;x%atP%KY_mjzkwgXjRRK>e9tq}q+RWb8?EYk?C0nAzW4dFTYuk<e*UxBPgwQS z#Q#seYclr$os_X-v<;RvnQpMG$&Q;WYq8@N%a+*j5^JO_mM$^9%(6B+ZnK8MiWQc& zS-Q-AY_Q`s>K}Gi;H>z4iLo7?7_DXEmC3mo@yw)!mX42%<-<bhROMrys?kVVnR|Y! z^3;)?w^H(vHCgoF=<y?-nxx2J;CfMXWO!nw@REyQ7Tic1Tne7cGw#o)vUbwt=cd4@ zOu0Ak6RB*fCHdk`&ZHHZ`w4<@+fnr1Cf~uRr?rU|&Q*cVgjJ?+!EcC8mLA+T->U-a zQjhlSM!O~>_g%hUTJ`wRL^{c{!g)U5-A^P}xtDe%5{fp8hr-DoC0=FZdIu(zyd$)q zm|{Eul)*F4G3@w6%m{)j@FJ(ix$uPra6lLSmBo_Wd0Qmj*e+6&i-@_Nq}_T|z?;#L zeCi7Tf<>MH%EUPr+8I7Xs5NW=QaCPhgAHs5CE(KK*b{?Y%tnA50Z<9AmWjXsE1wj~ zN-E<$0(&7_ZiXk|3GXBVgh}}kmVZhN!7jsdifM+JK%-5hCVZrF?5{ki1ePp1a=jAC z1qW0DMTj~60k2{}8s1wqEWAYRYl7`k+4&ZsS5kmjQ=obkq<m<+M;Q!iNo63apavBS zqKX(V^%4kOal=JbO<%gAvT+n8aqOkWm5qxY`m%VGwaMi??@WSE>2@@hey<7~8TTcq zlY`{Q+!`}aFF;|a{5W!TrUCFMdViBY9EB5hrrd<EvPB+T6uI&o(0W&%z`*`Mruy(k zG<%2|3a!3Jk;||UD)}qvQy=ZKiApA1B#E4&;5g)jyvWnYRzV96mXnkab%n~Q8x9YQ zIFTfofJu-ToPlaX)IUj#B>{>MH)V+$XTnptv1pz~$RdK$G1h6J@vov0LuWL&6NBN# zdcTUXRLztFL;W3m0DuHx##-TwBXLDa+i9Tjx5-wHM4^2gj$lG_q?zRYb5i4f(79mj zgt2FgU537Iu+tT0|Dth7^l6h>O+pPx)<LB&TdZ*b?Y_lMSDF2mgc_<`YV{?w`(lY* zHdqd4Eq1cPV0zJHKQ-9NDmx^f?cnp5;BzJTTw|BZShq|j*d9jrpOpKr2HQV^?OL#n z*d^|R`ToB#f2-cF%}&;@?*|Ohh#bEDtigT=QDK9VS7-<$hn;l*Q2Yu!K7$^MYif{$ zGfD^YIbjZ(bEf<xTrPeKRdmIa3KT^gKQw<tw?lctbCH!71&SY*hMVI`ARt9f!iST& zQ(n#FW{)41?qnMLk<aR9CUgN+7FOaWsRyh78>z`Qu;&gR%Nztu%Db<+wD!Jud_yO3 zW-5LVk-fR;uXZo^(@gi^yqAIV_|NGM0eNe&4yxO`xqKs#?!^HGD6ac(Tt1x|N8yP4 zroTEIUSD}ffO$)+(}f%EKW4;3M&-SfR3b^<xPs2kgwkTD%cDQv^hS>$DIMHckK5^a zC^XDVB*L1l62Mw`h-73@I_%;G$x}^=abwS`PpvZL1M1<SKx^N1&($L=zYZ|i(b+95 zy@E7u-RV>-u&ENJx?rScC6}()>cGjJ7lczjw&uGBGF_v(?2Vs;q{`(g>)s-az+*nK zSfE}(+64+KlDJam>Jbc7BcyQ^RSUch8R1jfM)(R9h-s`?u0PA!tIy&sOnjAFnV4~| zi0gzzU9OFH+y+1BkUo1_qRpAKL5<0(dQI$#WFkFgS)W4i)EwY~^b{N=ha~#6+LH!_ zOEP;Lo~;lx#)yrTr+ypXeOlJ1RQ)SxV82f$)e1`MYf^@NYoS7928-}M4p#=nMS>L8 zUT1_S@26+Nj$H^e#5CWsgIN|DN6DnygE4fk7!JNs`Hmi0nJ)B(Dj)0trt#p*b6o!U zem)!A>wPqMq=o}Xo7|d;<W!8M8%))7fQMFU>|o+E{h@{h1zADt25}6j@p0Unp4SO4 zK=L+1an!K8>kaz7)5Kq6t$COF_@#E8zA<vpA$S7rag3Km9D5pw<55A+*f{Q!qdpO; wPd8+!Y2lT20q_1AO;Anxuc4U(@;{@pieT=SXYb=T(04S@Zob*P(`>i?1s5LoN&o-= diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/_base.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/_base.py deleted file mode 100644 index 8d5bc7e8d..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/_base.py +++ /dev/null @@ -1,377 +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): - def __init__(self, name): - """Node representing an item in the tree. - name - The tag name associated with the node - parent - The parent of the current node (or None for the document node) - value - The value of the current node (applies to text nodes and - comments - attributes - a dict holding name, value pairs for attributes of the node - childNodes - a list of child nodes of the current node. This must - include all elements but not necessarily other node types - _flags - A list of miscellaneous flags that can be set on the node - """ - self.name = name - self.parent = None - self.value = None - self.attributes = {} - self.childNodes = [] - 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 - """ - 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. - """ - 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""" - raise NotImplementedError - - def removeChild(self, node): - """Remove node from the children of the current node - """ - 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 - """ - # 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 - """ - - # 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): - 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") - - listElements, invert = listElementsMap[variant] - - for node in reversed(self.openElements): - if (node.name == target and not exactNode or - node == target and exactNode): - 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 - node - the node from which to start serializing""" - raise NotImplementedError diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/_base.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/_base.pyc deleted file mode 100644 index d42c6083cf1aabf946da56cfb99036e31989c248..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15572 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 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/dom.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/dom.py deleted file mode 100644 index f9e0d76e7..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/dom.py +++ /dev/null @@ -1,290 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - - -from xml.dom import minidom, Node, XML_NAMESPACE, XMLNS_NAMESPACE -import weakref - -from . import _base -from .. import constants -from ..constants import namespaces -from ..utils import moduleFactoryFactory - - -def getDomBuilder(DomImplementation): - Dom = DomImplementation - - class AttrList(object): - def __init__(self, element): - self.element = element - - def __iter__(self): - return list(self.element.attributes.items()).__iter__() - - def __setitem__(self, name, value): - self.element.setAttribute(name, value) - - def __len__(self): - return len(list(self.element.attributes.items())) - - def items(self): - return [(item[0], item[1]) for item in - list(self.element.attributes.items())] - - def keys(self): - return list(self.element.attributes.keys()) - - def __getitem__(self, name): - return self.element.getAttribute(name) - - def __contains__(self, name): - if isinstance(name, tuple): - raise NotImplementedError - else: - return self.element.hasAttribute(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): - 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'): - if not Node.TEXT_NODE 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) - - def dom2sax(node, handler, nsmap={'xml': XML_NAMESPACE}): - if node.nodeType == Node.ELEMENT_NODE: - if not nsmap: - handler.startElement(node.nodeName, node.attributes) - for child in node.childNodes: - dom2sax(child, handler, nsmap) - handler.endElement(node.nodeName) - else: - attributes = dict(node.attributes.itemsNS()) - - # gather namespace declarations - prefixes = [] - for attrname in list(node.attributes.keys()): - attr = node.getAttributeNode(attrname) - if (attr.namespaceURI == XMLNS_NAMESPACE or - (attr.namespaceURI is None and attr.nodeName.startswith('xmlns'))): - prefix = (attr.nodeName != 'xmlns' and attr.nodeName or None) - handler.startPrefixMapping(prefix, attr.nodeValue) - prefixes.append(prefix) - nsmap = nsmap.copy() - nsmap[prefix] = attr.nodeValue - del attributes[(attr.namespaceURI, attr.nodeName)] - - # apply namespace declarations - for attrname in list(node.attributes.keys()): - attr = node.getAttributeNode(attrname) - if attr.namespaceURI is None and ':' in attr.nodeName: - prefix = attr.nodeName.split(':')[0] - if prefix in nsmap: - del attributes[(attr.namespaceURI, attr.nodeName)] - attributes[(nsmap[prefix], attr.nodeName)] = attr.nodeValue - - # SAX events - ns = node.namespaceURI or nsmap.get(None, None) - handler.startElementNS((ns, node.nodeName), node.nodeName, attributes) - for child in node.childNodes: - dom2sax(child, handler, nsmap) - handler.endElementNS((ns, node.nodeName), node.nodeName) - for prefix in prefixes: - handler.endPrefixMapping(prefix) - - elif node.nodeType in [Node.TEXT_NODE, Node.CDATA_SECTION_NODE]: - handler.characters(node.nodeValue) - - elif node.nodeType == Node.DOCUMENT_NODE: - handler.startDocument() - for child in node.childNodes: - dom2sax(child, handler, nsmap) - handler.endDocument() - - elif node.nodeType == Node.DOCUMENT_FRAGMENT_NODE: - for child in node.childNodes: - dom2sax(child, handler, nsmap) - - else: - # ATTRIBUTE_NODE - # ENTITY_NODE - # PROCESSING_INSTRUCTION_NODE - # COMMENT_NODE - # DOCUMENT_TYPE_NODE - # NOTATION_NODE - pass - - return locals() - - -# The actual means to get a module! -getDomModule = moduleFactoryFactory(getDomBuilder) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/dom.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/dom.pyc deleted file mode 100644 index 15d27d6806cc87c0cd4d5057cc364e5698796b1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14622 zcmd5@+ix6MUOrXbZo7Snor{w=$z<b9vTIlpR-@gyk;#l>du9TYPE_`8W-VuH+udcS zo$l&(RdwQ^F+yaNNrc2j%MQ{YfdmMF5c`0T_#2id#4AEbJfRg&ti&sP-*>9ID#p=1 zb`n?l-0IZtemmvT&!@(J{GYDZFzG)Rzd!h)YvR8^qlq8Kw2kRFX5BFz*Q~pyQ!?u% z<8aP3?Xu~NnDr6UshIVO>5Q87QPUYS>tl9B$+W9xy=t0e(;PAFanqSF>l2u(nC7VZ zlV*L=_Qy<n(sZWG`jqWgP5X%HOq=y-^vBKT#;nhnVA=#T<_X|AYMLdpx-bDaTLgZg zgj+I=TYWR`w);uow>rIUlq6#qYqlP?;#N0IX3*(}twy&Q`0Z8_MD=#OQ0AkfxOG}# ztJ&=&9H?PQGKI#cw?6S}i?>!*?<_8@=nWXDt>$C3mV;#ryd@*J`J44PXpxk5tcq5n z8^%dJOkz7Uj-jyL3F2P85u{@$FxKfd`|aSvdL!vZkJDcbZp_^(xJqQs@1ya|HP0RL zCoyIV4VM&pV$AoS1KW~G9JAwc;tONGD48vnJb0R}D3KdnfeEa@kIO}0jF>Gjs*<hS z$F`%~_W6hbil9n!%)I$US?{Zwr;d4ECdPQ{>H;yUiPnor5`EH&lLkigkMQ3h+;`9j zz(?$B#85!xr~!zCz&hSh(#Qw_#=9X_0G5qWg2u*J3Kj&*TU{V~8zfJ5t@2f5+-HvY z4BP-c2q2-TS?ZJ3K|AOKVY0xd#P2w0Z+VmGE#R`ZxQkZv-Hq*5a=*X1akmvNwzs07 zS!ivx!j0u%v%kG@=W%ks8?J;8H{Q7V*2X8T&5aoHbp;H5P~Q&Xjb5v_@h}LR-Du-} z(rJIEjTK20;MrEY8AS001n+9^u}J9q5X8jykK+9?AvBJpAd>{4cn-s0K2Y2dv%yVp z0=ltNwk)w2QzC_68$1z$33*iqms*=plUOnfP&;w<Zm5Oti&P%zI9!5w#{dF#BO^o! z?d%dEPGNvl5FyBP*F14yG;*$!gcfx&I1UoZsIZsW5SF45byD<rSa0`(;Ub>Uw)sAw zC3AeAXl67ZYk83lMPYzalM*gf+lm3?0Y91eOBnc2I|w}*OHsw6RrDxquL{#;jeQ?b z`u-WfRm7XjBp$;1Ei|@Yq6f?O&KTG*NCd3R9DliH4wmo-uGyUfNl1s9oQE~wW%Lgv zio}PSAQ>SyhASCj)oXw!CdkGq9bz3$65PYALnaD`U@P<<1dpvldKGk^yr0LF@t>T? zF7cm|Th#r6tcz>Z_k_3YqS6l->d~+amzk-W13s(fmjKa0bO&nwD?|qv!y7}dT@#%) ziEDnxG2x8JAg#wN$<WO0pVXdKA3>1fkcPE#Nx#<)lH-`Db(5PNbm$X<=1LTGqugNL zugAH;e5Ghd&iX!rtE3LZeE%Eh$BdJVGwoDeMJ1_MqiOej`99ybahC6UN3c{L#-qY` zr+K3x^eB1WIo>FLxrnGWjKIL7JD|A7yj7fPDg9sOZ%GkD)*CjQXkd;0QFL5JM1P4! z@M7>4Ana271#w~IWkWDTUXzN#Fo>ATMq!A#Y!rrI-bP{L3@sUXjxt_ERFB~Bb2KIm zwhbmsFi8PLG>`a_%MdVP_J~Pi`DxRf(0T;*Sf2&;2<T{N2Latc@?Xa&B;STQ(0B+r z10MK!w9xkf|BC|eG0gMIyphWigAf#|K@cR{iv48eY!{1$7xxLqtAHT2=_hlWKA^!x zqLJBjaE=Dxy!2iHU~k@%fErrsQ#A%D#&^A&d6olpX7rcqcX63~K&=}FuS_T~21Ks4 z>z&PJ{rVed%Qzl$1|mXq<qIyLVI>1GKN_j5fHpFS#ek3`O=u^2^#~Tvl7b3W@AVL) zFWpB>o{NVK4Iw(Y85oKM_$C1S4z5&0s!oG=P{Icy@-aF@y?{NGd%wh>IQn)rg|0@h zj2e_W4?I)m1Rf~Tiq69lh??1b6b8|9x6!AkNT^tiD5xjFTCkTWWv1N076(ysBiQOj zfk&t%e0iANtS5EvS1~TiCU|tXl$BSoKogI509j12GtR72apqjnnKT~I`RnKm=uBIL zE~0Kr&r}GJ-R2gFPl}4d+xum7^W4LeU#Go_f-O>Uxa1Is9{`$E(B=+Nwzn~D@rHI; zN<4sweKVtqo6b_0LZ#qXeTb2!xQP5#6D2}a#3<-=9|lrHkJPXf%YzS6Y{*oiDlX$n z1CCh-Hk$yF)dQn+8=bxPGpfK40ky@f>zaMg$*QXqlGIA63ROfNi~erO+})P6`Ebp- zMA3ZZdI_U0Vv&Hc2)fmZ;=~e=kV+3V(V%tHx?BPi7OBGE(H+@CrNCM?ToS8X7X?-{ zgbJ+nO+Xrt<7S*=&ZINroXA}z$$mVm|2)f76jaQz9wyBqTEV?(j4~%=hhf=OXDntY zDwP$p02*Ola&&)=2BakVQ?vKuG##LeQ}Ji{-fx)=$rX$~asvoaqBtq~oNZ>pkf8@v z6Wts1U2}?4B{O$wzih&BO`wMkg>%I0R5VmZ7HvHQD!@pg)5%dz(r>_(VDzq4_tgc$ zYxC<qN&K#|Y+Dx{L*J&_3bvWcdgpl~3#?GnwG=BgwN;OaigvX@o2nK};JjJfM8n;F zz1`Ys1x*HdV&`yqT0|gTB}RnTz^Qx<3Cavy%eZsg8F%5zNg`gf9ui?DB+oJt27kd! z2y#J|xzf^#%G+ooXp{LQ-9JQKyBNYr#xG%FX!P(tz}q)*Wn!Hn%-<4gh8L+Zlr(2L zOQjZ`-kWF@6c@eW;UiN@tBd55Ni$$Mh#3JFX5U7`Vn*E?GtmWdQ&lPGm&)_2cAj_J zm!;<pwSF0Q){JckFG~&a*4cqo7!KJ|hWJcE4q5o=)?v`7hHES`+(&<qm>+d(3#{sT z7kPV~H)^{wv|iNhA$EN1EpeE!qeYRCzYU$_%zlmCYrMVBn@qt6Y~A2(88_?EviDnZ zkete+y-R2fPZjv~E4bowxFMA<PnW9Y$<b=LI#L})durOny;Q9ztzW|_!AsNnKfw-= zJ)Ehe>9|pzjRPGV{NMygV#drHxjs^Moe3e)$Kef*?b2>Zk5sa*4vLui+l+rq2S~`^ zbuh%!JRJ(Hk7pS_Qh&6o=5y>hX`bOe#S!HC$mZ!+2eyrZEZauDK2zND1b6JM2od)u z2!oK!!*!MEc+f5wJVrbT4JagQ`Sz_r!K$9{XpbUfbCE1Pk>tSpVRIbnF}!{h)E^+k zR(u0V+k0HFCR80QUhdlZ?$9EEW}03twd--b3$W5S{Jf1XiO7JG2|9=cXiFGNqJ<(i z^F6ez3m?#VAM}JTN4PF`4Ob3o@58l&1v)VR>prWbPR7Aw-~nU$o>t)Dit#HZ^X`Pe znkJSH`eW$!`kU=m<7QKx_;HLv`OW46!Sz1IEuqf8$f32zy+CT8p=>ptEc1SyH)@I9 zfksVyOS%tmctJ6+1|xl`I@wFbY%m>1!0oi%NboM3)8FFGm$)-7Gc-2agcHI_$ohnY zX3RL_{O?X8_dJRCc97!_Sk9D!@tSod-x7DELi8-QD|SKzpgfR;a5m$yk_wI^LM$n| zK-iW?$BZ1T(h!nnuvPE3Wy7tnAx9KuSthR7a<PuYUl^&a=J~!DWsSK~HaV!_(w@F4 zJ^q!3{WkhB<<~f8omqF*RTf8IK{-4$7PF)+P)?rZ0DYFaoxu^ajaa{h{j9|qJ_Q;U zI#J*m;5saL5$=q-v4B=Wwi*`uP{bLpzNp<FM)hq`AdgC30ru07Y^9J1``;~KPd;Xs zLbrp5%dnKdzE~g2jg_JmN>^SwRAonIMz>+u8kyAJdkK!>@Hi&P;TN(Cj1}<^T5^#J z)lg$t4WbsZt=|ly;h}~?ulYk<2Zfh_ihXoGR&uj!LJ~+#Ex3O4hUg0zA~B*#z5XAe zdk`Orr0}6K!sWw>LlA9rgnS{xjV{6-dwj%o>BgBF9;|y{$?&lD>UjGf<H}H_8u20y zLiMlEfJpKLU#LDPvAkGB9<!K25aWc87`l<sI0lk?i=HxCVBtc8JEP{osNvvPJ_1Fy zvpz}~*|ME#`XJSO_bKC@bPjb9yJ#X+m4P83dun}_GJI9d{18<*pKd)~pyK2_@s!7W zonw?i9ZxA!SzGyZ&9B{FUP%t!M#U1HSlAN^8z)`G7I_WNqkFM+QZ$ChTH^Q>t~8#h zAc~nQ9YZ{G+BxUc7WCc8Ma<jOug2E*c%vQh)_L3D?FYQcrc%wlAM!@25e*gYGrZH0 zwK9OhVZIcBVV<aofd0i?LBXHLU5977sG&VvG0&VU&UE?M#IdpI67xRgex=FD${|%D zrn?kFIAO#q+xR#Sftvly59h3i3YFX8(?ACEnqpZFsQ^p{Y&=BP24}V~r$~opf)xb$ zf}cW`?f&)?LM8w|(FoM<M{1N!d_|2B6GiDr?;S#sR<lP;?_+fpVnPQ26d-`Qp5WGK zDFMO9h9{+De@n=?Oke-y%Ycqu@Rge`KmpwDgA-*<h5zN`&_c%n?LTL`DV1@;e=4jP z(~AGjR*cG*hkspIQPqmeOn(Rw&b@QM$4OxO+J51Y2|e;@_6QQ>Lm#=};6oI$WLyWg zUup+r%C;K&rGxWugwi|qLyjqwS^>dPy^%%PstA45pq+xILwXSlUu33m@tI==k`aC7 zLN<``?L9a6zynz`r)G&SewOb=S>iWqc21^Q-#)D1DBsDtFB+%JK8z(AQ)VBpN6GkY zHwUr`2r+lM2;tyqYk9HF7^lVL|8VZ&93(;27+;JMgsZAkm-&(uBM?KBYaTJDPO#F9 zr%R~_1TO2!Ko^s5!6)q5gYPrg=(yP*m$<_~%l13FKXLDZuB$RNHKtak&ks62yBuGe zU%tJx_We667cR#aE?$l=>ULcf>I;3QJqH$D?;klhc)d?`c|FTn`^;+xy(?L4nLl^s z3SV~R%Ju%J-HPx1e+Tq^W?xu$InI_{yBuHdGdKfCm*e;Nlr5j1#hCJ4`WfcX){hVl zVE5fyE44MBILe{e49vrv#|pFu!q_ZsuvBh`;rn3ZLvQgT?V>5Vu%+9#@&TgHSAUOR zNqU>;d2(srU~7T5G2Co=j&e(DFNnR%9AWHT{F=yqd>Ylm?Z9KCZ3}sGY^kQt7qz>M zdYgqrxxW~nbO%k3$B(Kl*#bB#L#?pMqx>9EmI$;VEE%SC)~pX7v^9Np7<=#Hm%?=v zWT7?>b>xK8Ya808DK1eON}a%agctuEUrsN{1FtHsX@1<~oOkElv*^vF*F1jDyPTVG zW^kf#7H+o!hs$U9zv8@x(Npf6^Ghf&%s3MHaf`cUXw*?WFGB5fTcM4R75Ve+HmiAv zmcSZHE<>OFH@MORz;UPI&R(5z`-~j-I&Bq8s4<j3`LjjL(DXt06f@I9Ja^%M;(*qI z&Iq%xHMqkt!B_6ht5bnxIhj{Uur`e~ci%R5`D7L|%DTN*N&`z+zA6ncMqx%%8~jrq zaoacSOr*2R_x?V!!Eg)mRjC1<G6-$}XZ)|J^`(nIY3ECIQ5T(2jEe)nYy_^C(ecmI z1-<{FSE2C+m`7<wX{q5CfE_D<$2ml>fzi$h!b8WcCG^Z=<{FJJ`cvtKu;K6RerfP? zckj;*#pT&caY=#SbPxn^Pt+7ECfamt8!idsfCZL+ju7L=)ry}vhX9cR3Fri;JdnKK zwcVdNyPN#EOFB=PUWH7CZ^QfX1JvomK#x=OWR~YZ%QkE&^cQpf4Og5$eaIG)oPVKn zlS8t!hqJSU-tEGD{e#|S1@Vl;@vPal$o`{C(9UTA_ypF3PYbJGQ-o12anX75>lcIi zZx+<AX?6HcVY3U`?7h<7B@Mn@&M%bcazVT_Vw8h|l7(@4o(ml_3-h>nkn=Q`p|x1~ zWF_|%9KfHxL`iB(<p`{urxDjN8a}zoiiu^6HCv5DRa^a40uFwaG0=g_Iu{ShdEn{E z?a&3t_h?7GF@A(U+)&k7-8*tcw~#=!!fmh3^+3*kgVgBaPcP_z;~xGjNXGzpjgpKa z@U>NaOq|1u0mcj%cyV|7M7?=wd2wygUtL*RyLr226Fl0d#{GJPzw*J~eRwS{rDN2K zvMPX*cWj&WJy<ZK?^*MYh3?nGW*diPggcBo^`5+$rEQ11(hAb!u|n@5b56f`6CFH; zMY8Z&vHXp=zBfEi_Xhyy-*LrE1?lN3D1Y<gj^plZiGGZpZQePL^YSTpwkhXKiDTzg zBtPz4DxJldI@h1W+zEKb<L)u}xf9M5S~Je6>H=j%QABrhCuk&vFGN4Wj7K_ZS|LYl z{oNL4I4#m>3wwlkixZl?#1`RKN;wR_DEUzhsgs@*N}w3I;$s8%<ZBm~7T&48IrqNK zU8NzuztvCr5x$9L#AH0iNFHM#i38O9D$Y+lc+d13S`x>TlKlo3;Y!OI6f%zigygWF zwA!&p5%+$?F{-}>?3Vtv%~BDA!%MxT7T4@2;Ma+E%)t3v>7p~~B6Q;aQuTk$$^Qc_ Ct?Tjt diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree.py deleted file mode 100644 index 7b0cdd8e6..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree.py +++ /dev/null @@ -1,337 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -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._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): - """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): - 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/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree.pyc deleted file mode 100644 index b502c4a3599505108e59b6d44db4dfa8b79e3bf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16360 zcmdU0TWlQHc|J3{BzLK$NKqGxmTa%&vRKQe?7DW`CbDc<mqf9(QipU{vy?Z>-66Tu z-Z(R>QniSpRccXvYJj9@(Y_>oDbR-^O@RU}&;kYe*!Kc`=tExGzV@|%`+eUzv%8Yz zBsLH%OLB(iHfR3-KmX-Bm&yFk)a3X7(+_IK{rLF*&bNIN{}_on{yft(rsbJc&$N8A z>YG-^tY(bII^Q(2rZr|($80`hn&W15+|;wCK4zK|rj;|RIn<$OLixN|&D(rV`AM@n zY4ds0oHVUNX7!NGPnu@Iw5H7Jl<~rGvwhgq519v`W7>o>rd}}LLHdXZr%ZT6<+G-q zF-xT>(A^+2r3`M#G;Y=PxYO(<VWrXPcA_N7p{(Ax+lU*Tb~1xZuidD1>S3kXNW!Sv zj7uIL&GQ!SCY9t~H!L?;W-G>!s;pPzut90rGWOZns-k_XIe5I*X~#*mowyz+(WqT* zg>ko93tibUl(jnbUNgK_ttFl4p8MA$BOjN3>!ZEf=U&_^oj><tjc?21VmBF%Q3f>a zPnbtzW`E3VYp@`pZO=S{z<rbWW;<gxJo9jjcZlZ`V;&gu;UkPs*6e48>c;wY=w>{v zQwt1T`dr4;bC1{M`*nE1<l}XR`gOi}I4%+jEP9kDMJ(}6eTpS}NE{ZumL_8!f@(aK zF%Prm;e>gZGY|7-BWLQ<X{UP`lZ=s_r4q-m+~asx<9afI|5uw~D{Ln<B=y5OpCbD& zBtk=Nt{*WEjfgVl6X+6n^UQZp1>yKgj8SAP88_jCff9yzA8Y_rWL2K0nzO;A8sMH+ zgF_S{%L~+dCZMJ0p+I$I4^ZZu%BM{|uf&WRNVnPG2!+W9q1A_!I4Ye-$uY`|RmaH! z#709nLBX(a&eUg=IB9~V(k!^Gk#}BMTt_K`M@ZcF%zbDv6220i**9ieY3K}VeNqZ_ zVzVr>bz|=2O!R?Cpk1DsM+I~aW5^a0rhS|VDBlz1c#I8lX459}X=0K+E|sX&<sOOK zN?<#OkifX&30g`*T~|sr6UZhDEZYo|tIJUsE>|~Y(3Q{*dBUE`opu;d4`jsbXt~#I zh9KOSZZ(2tBz#Y$w$*6X%P{>|Rh5lqbu+e(gWbeob3^@!6u!G}z1GIriBmPwQbN|m zJGj-qy0+O!wtDMpD~<N0=0+6Ohf?c}_S%(jy|=k`>t3?eX<u#MU3=~Pn``ek*4JYA zphftHJJroFUh6ixYj?wTy%VibI&U=5BEg&1dmucF;<b>u^WA$^29-v;kyI-5DKT%x z%j0(%zXfmJKdzkgf!t9imZ%ReA~6_W45MdYTy1z+sR6PW<P#{mPX}wqi<10!A>LcC zZY(&Ae2KjVM|tDRgX6eq07PUZscuR@Ba~7=)j5MJ&f#VtmApUW)yNXBzC>O^W?&&h zT20-SVK9-QVbrO^j1A=ywKkx_>NNqCBcK;g*e|)~I|lL@wJ@y8#9>l~eUO-#<42XL zk)QOEiqMv<U8l^lTFi=hadj{lf@2^<FN40A0yjVZ_*(ae7@7LPr;M*gm1<;1n&TVH z<2E$7)ccXkf`nDv;L3OY3JSjX2$S6dG{WM_jj*_SgIu{`PBoVQrM0w0tF;JAsp85A zWtQ||)g*};>j#KKI#LF=OCk)YHU26}QWi-(-3%|W_&p?c7foUr1^5%@djK8w%$3_m ziL59ARlvu;wKH#4c5l<UZD$FduH3$9)_gXzcnWP03Sj_I?A$-V&^)6<#>^`WWKDaV z;bIS<!1g?0?jxPyQ{K*7W<@TMzNFk6gb86~3!-zVQdn&^;zS-YcrGov6W)sz{t*US zvBE!ax=?g2R7IjlPL~Spwmz33M@{W$QfTtI=uD5?tu}k1V$#UXQo{?v2gCaoIbpHM zJntRx<`Jw<`Qtyo4?cn?51{^D?nA5h$l#DC=Fsty{=SBUHPP1`KJ?7)DeC8t_CkjR zMZKLlr(HDhvVfY^9|}Q`4yqDHiC%821xGmSnin{bcwp3EAf+-$bf{zkA$V$_0JJ2@ z>UnZ8Wa!;fgcjBaVea^|KCZ{u7lcVKY8R8J7Zw{E#bhfiwgGgDTh+KI*b5X~>_kP* za0T3Ck?WmK(_$9Bm31<tX4pPJDn_>sHZEiK4kZ6A<g9x6eIQ3|lgM60!m1Z1CX$iI zJiMgx1aqEY5h^Q~0^&JwTDD+TdZjqg?E;2dW#e>n5bo^+0iqqbQZZInMW@ti71@}y z8*j!t>U|dXUqn@3pCASZ19k?%AWgJyy}MvP;|0p$;GL*G3w(>{&8iNAQ=?sn^6>4} zA_EDHN@W4?uOcOjjKU30zyb#HkxP)c&eHpCxY3D1%#TwMp7Kr%fMj34ifBMNNmLY) z0xuWGo~}=Q+!2MX&fQScCMz0tIS|drB|%-XG)kAiPzoNMCUKBCoHDaT_~T(sir-GP z2h+=Q0uqu?#W!s$FwbPEZk~D5XW@SjO+X*IX9+w2QsVaDc@_ba_xoTzi#E0&RQ!-@ z2Uc;N5@*b|;EGdgw1w(s%$=->{@1l+N!Fay%l>2Vvb1>kg=yJiFI^mBcFyCZ`KK}q zSuP2;lzWh$X?%*GhEj}bB~G;h`Yr2hUSW#xKz=5vHkv_^MY0zTf|N#;^=eWLevM6Y zxTQ}1U|1G?wzaHf_=PRx;<LCJElo^&$Grk3;zzyt%(OR)Y56g4&U@A`pteS#P|^Cz z_C7LJ*)YUb)Vyn2z6bPhPK6kE2XN;H02d&YMvA*{F6_KyR**~mJ!NTSjOE_J0!Hx5 zC=W>M(DH@?>@il*P)Ba8T$!phvF1fj`n$+DAaTk&4Mf?Giha=a$7n)1z{Fp22`=ct zL}ZlGUI@vW<~P(rQj4!~X_QYYSoX~jZK2e6@|-l-+AL)})DM=EuqcLStz~HG7IwLf zse?#iWRYEv#<EO8#!;ds3))MawNz*A;%le~`o<AZJ2ZN1qDB2Ev@3n`UjREp5nC&H z;cws4O5mtRFSrcS{{UCa5Xt42vr_z7?-UH7T;k$_TixU8W2Iu(L@RdFpi;3hWDc$D zvePq6ok}0-Mx8DI@ja{1r&;$bZ^wBfpbWVBXO;XMQ;WP^;*ARi!Rx%yrv#ja280a3 zJG_x<D>@oza3al)X8BVK!-V>XHpYy5vs3wrd^Vq%_T4>`FCd-CkE>)XKbFrH=JMl$ zAeTF>r*9UJ?+}aX*o)}z6d;Squ-z$u+S{FiEVl;2j0xd#uzEkvwRdWA-}D&Wk8-V* zLfwZESgn`;s$efdK@s@V&4IFM0$UIRL`pOje1kW_hyiv8h*ATt^$&DBxWMdz7#gbP zcX3&#l$o`w&?GIrgdrwTK=&XIkve6eB5_MoKR|Pk9LV7^%@xGlKSg?Yf=i-#i7gs6 ze4^#d4)y0SCtmy0Rcl*#c%&N&Sg9a~e@-$;pYbd{xr$_PjW;=->r8!<x3BXi-9zGl zC?HMdk8nu=$Gzzs{6Hol*1yuJ^=SIb2>CVS^+UteUg3vGd^z)X`-T(gMqy6=0Xu*> z`G-9H!x(z6F>LYTJLMm^9<p!!gWb>Nlq-cfK*|6vP$hT@LK!67Jd9&g?$LxUoVjxI z^74nbu3ofjV;Y~n1u2kpd+W_c?Rs6A80&3e>w0|%-3ZtaWd%2Ivqr~|DU}?Ne<vG1 z#O09947Y9uOC%JZtc~Uau~;VpFAe_;hisj3xtBw2%DjaavN=je%N(%h1LR_;pmZ^} z+;IIR@=v;%KI25G&=W)p!mzUv0&to_70QXPh`<<3tgZ~p!mgBYl3^pu0#ZYvgyYU@ zlnNko<$gvgjlTjtZabs!r4%7m{3jG4D3ehIPAb#E;2T=7<m~iE<eNkIw0*5Fr3I-V z{y%9!DviITH0VINms_I$3!Vr~H(7RzH-#p-wclVi;7tw=i38&0xK#cFT-pynq#8%0 z$_lq;<*d_qRU^s#p&}?&(LX*lRw2?*nKg}Oq91AK<@cY6G(-M@P7#shgBw@N%a!2f z&1Gv7e9w?|$W9JIZ1@Mzl_C_f_=Fl*Gd>X1E`hqgPpKXEG*?Z>^;%Tjd~7Q6iyL3g z8T#XUEx7b`4)nnu<9|w}1{8X*$9Nf({$on*&|V%rm0%ucmYC~362{{}H=TIf(1a3) z(H`MAmOvjM3_~~YBp?l}6)Rp#LTcp(da(0L;)EP7b^M1AOd<?qAB~@LP~ZVh+2Q<> zg-3t|zPW=<-oI8YUW?sZ&&2PgS<GWS6Ma9;s<wNZ$KBk9G9FQzZluBt>BWK@&b<+S zVGR~I6=x4K<^($Oc3#c6dM)^%9_JBN)BZi54}hSY2)g09hB!%QH)hZnZi%So)AS`c zId({Br(oue+4pg4nh!VzfxPWA&w6m2I53C0-}lJA6V74EHF`CJ^GWPrQv4#T6Na`i zh;IMH?G{1w6xUu#9nMCHf+yepV-LHKmLVV(ydwUQmrU`XUUJx#qjTH9kqokMN_Bf? zP|cln;d&mo`*%md-k52>!t!k#cQsnl95*OTX3h3dbAQ~-?}6!Aa~~3hczIw8$3pF( z;OwBI*49u^kIBK$KpFRPX7_=pm^9nR_>wEPBfSWto==Iy5lHL~^(n-#{DuF8sG8LI z0dzTO?&qj8_mRNaPP-Gg^G$zc_idBl6dLAA+yy>AAi=SN6Ocp04_(94siOU>zv5J2 zjKk}m_!$ZV+*~kka_ty9&tx0tCJvc>sIcBc3*5PsS>dovnCO$I^m<Z?Fd?~9x}ZU^ zl*?@PWGc>oJuyFfd^$o4PLY@(X^)|{KbtEq#Kp4<@mbw2>TvLIoh|A6bH?i)!}1Gt zH^c2sAa@@f;IGFxSk!@x9uHom(Z_BO*Q)JyC&51P-LS~*2A$z>2P=N*r?wuPzUUpc zZ@X}2agmfSE?(@NM$y$>%(IiQUUVm}UoLLqRSWUUxO$urqb*X7)(Z>qMac|wFT`(= z^b*$@wP=S8V7^ajz~iXXNpucN_&wk>dT4c+i^V#L$cg^dDC$IZhlSh+FYuOO3sQY4 z<^ckn47bhRW;t;s#;+2Eo8fL(M@m}Nq_(B~&CRIO>&5{W=Y-L^*wJk4hH-F~B`l6{ z=sc{K=%<61(?V{Lwv#}3lqgh;v}5(F#af)+hQGE4Q*EDimA1sj+Uf=Sl^DmD+M6Ot zE944{38gf2F4Zk?l6mzS-4*Hpqm62_@jIbw%AQBG+7xWy)&IiRe?%g%@5A5curI_z zt8@M{$W7r|aOJc3e+CCypZ8|5SYGgFQ9FZkGt=HU_B?ppl_f`Uj%LoE_g+LF3*ID3 zjvyuVpDfV`v}3T{X}Hr392}JgFkUwU2B<coZZr!Y(n+3YT1p2i`e#t&mO;k-lW$J> zHL}8s79<pK1qpa`zzDc`?tBVrxYP9M;ra~(R*$FYANlfiZtEH+0FcKsgc>x9-s`ya zUtg@Yi|!N+lJ#OEapy_oJ>p{0DOQVCD@7M=nZ8YQ;R_NMfcGt3h^c4Nz&8v~053d6 z+`myRqM^b=Tu!q>B+;LwS=DyGO;7?iPDhPLENbbg5G(;hfn&Qp448su{vdAL@LjzH zF#1}-0*XIV00u!5BItc(aRT1ri=ViD`AVFd8z2w>3ERT+;CX;<Q0EW`;vK?+J{5@0 zr+@)y0f-A(G!`1MjdxG;eOGSJ@I=Nwf~A=9cHZz-+Mc5fgGF%C^BfBnfef+mZ<0vC z#6L)z6gcABQz}=FeLVIN(GtG4f%=fAg4v$7P+&oE81jV>52ud{13J9%k#BbX&I1>F z_<qC+d)mDK@FWFjR#4F?CvTf|a@#%0_Mc_;tiR$qv?xg*wP<wsI6zWks5eQvAAmW{ zd2(U&X9ZqHh2h{@y!FAm?_a<CMdR-;D6}%HGp;VgjH+4Y7$+6e6**m~R2o$Xs23Gm zFT8@3zLl{dk3k~%7H`~Q{M@)1tg!Y2-d^R6Y$^V1M4i@ewwgR_9Y9;$COPe0QEm|0 z^mUotfK>1z&5Yf4fm&q1R&1=?Xf*K+R?zplqmD^qkZb%7s56Kt(}*vR$E0bTS+J36 z+DCLj{WF=o_ky4IzvexISaTGmhy6JpQHOn$=uZQ>X-o=?x!&IBU`g|u<(V?H(MNHJ z;a}UTHW=y2J1pzVW<(K*-aP487tgR06CN3a+Jb*-anhG=@N1ZN?Kdhl*7Ao8X|0MY zAYcO9s_<OcO@(da>nk`ne0qhrfUgPRoUn<yk1q@H=@(G77Pb+o@adKNkW7IK-x9hF z*vZe|aV2%=m5bnm!yYIbUf~`D{w-Fpb~M5b`2LF&Dy4-bUYa#84!=SumomXlWIZ9= zADE&S#0=WTn_rjDRRx1!I@_eXRKtFaV&)Q_8r~k^H$D8)Xz)Rnv^9sfrc(*+5ePum z!;NaMsn0F!=UD{M!c-f8w^o<6h)xa!jyHPE=BU4vB6h}%A)WPHqO=PrGr*3Mu;2nL zwl8-M!xA^{$%h3~5H$o2apH_ix|K_prZXr3W`5Q^;uYy~o+LIT4m265l7SEN9@(}^ zrf=>B3#M{S>0n=OR^wQkFDT)Mu!91J0tW>(dyc{u(7$cC<xE>b<-ixX_A|XIr&!YV zAVzsWl4N%}@ncUp&`$)*ym4LJe*4EzH8iui{&;^8+tGy7)rd@(8t@fLcNU3pC{_R0 zpUzBAmN+G}3@YwQb>3x}REM?APK{q7tL9_Yh_6=K#>$C)?Q`Wc2pqwn0}5s|GSO$) zFbI9I>EgmPsbTP^-Oc*X@0~t!dj53wbawjU>{nhtS(3q#$x3CThqLTB`4q5qKxYzA zb2T@@7n0}g7n0}W#;%>mvoZ>)QqCyp!!$#;AB8g8OB&5M$RVYfH*~k#Xodmz{56}t xh7kw@EScKZq{QFQr`mP|P&Z0NlS92=kAX2{SZSX2W_+HdbiYu!!l&l){{h4oS2+Lx diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree_lxml.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree_lxml.py deleted file mode 100644 index 35d08efaa..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree_lxml.py +++ /dev/null @@ -1,369 +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 - -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 = [] - finalText = None - infosetFilter = ihatexml.InfosetFilter() - - 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.major == 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) - - if finalText is not None: - rv.append("|%s\"%s\"" % (' ' * 2, finalText)) - - return "\n".join(rv) - - -def tostring(element): - """Serialize an element and its child nodes to a string""" - rv = [] - finalText = None - - 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) - - if finalText is not None: - rv.append("%s\"" % (' ' * 2, finalText)) - - 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() - self.namespaceHTMLElements = namespaceHTMLElements - - class Attributes(dict): - def __init__(self, element, value={}): - self._element = element - dict.__init__(self, value) - 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 = builder.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): - 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): - """Create the document root""" - # 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 iniial - # 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: - root.addprevious(etree.Comment(comment_token["data"])) - - # 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/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree_lxml.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treebuilders/etree_lxml.pyc deleted file mode 100644 index 582169f91aa9b0152698d98f9d0f7090e427747b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16624 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 Z4w-v6<xUn#$U~ei934J7QC=*c`)`Ei+e`oe diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/__init__.py deleted file mode 100644 index 18124e75f..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/__init__.py +++ /dev/null @@ -1,57 +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 - -import sys - -from ..utils import default_etree - -treeWalkerCache = {} - - -def getTreeWalker(treeType, implementation=None, **kwargs): - """Get a TreeWalker class for various types of tree with built-in support - - treeType - the name of the tree type required (case-insensitive). Supported - values are: - - "dom" - The xml.dom.minidom DOM implementation - "pulldom" - The xml.dom.pulldom event stream - "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 - - implementation - (Currently applies to the "etree" tree type only). A module - implementing the tree type e.g. xml.etree.ElementTree or - cElementTree.""" - - treeType = treeType.lower() - if treeType not in treeWalkerCache: - if treeType in ("dom", "pulldom"): - name = "%s.%s" % (__name__, treeType) - __import__(name) - mod = sys.modules[name] - treeWalkerCache[treeType] = mod.TreeWalker - elif treeType == "genshi": - from . import genshistream - treeWalkerCache[treeType] = genshistream.TreeWalker - elif treeType == "lxml": - from . import lxmletree - treeWalkerCache[treeType] = lxmletree.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) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/__init__.pyc deleted file mode 100644 index 1a2b4bd3b62a868e1d0c558a4e10bdb95e25cc8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2548 zcmc&#&1)M+6o0$=vNv`bN=Yg7Fc{J(5bvST7D6aBNywp1Qe;Cw6{xG-kv!Jy%w|5U zs8~=)p{E}Em-Juiq4(Z$>U%Satwd?BwP7_Mzxln7`Mo!-zxT7>|4IiXtp8H{{pQCM z><JDkfFXVps8Wy#)F}*8s9P{>LEVO78xq=Uf$YGr163QU4#+OlJs9>N5qNrswyQ4u zlE5&d@o~S0#Qx_5;E0u4N?tml71L8z>&i=R*;E@Q95;m%YR25D(SCNyDlwgM!<A!m zp(=|9GG{oy%Vu0%V)dLW%S44RQ5KRpjpw!HtT9Ml@`_ECxWaJ*k>V$AvS>BWvJ=fp z!wbh*!HAhH3OVN{xKl927tAdiPL4*qOYLzLDbYx!Gf_8^*W};Z$Mxh4Lu7q)M<VzH znV&~ubfwhloP5>l4!TviD;A41w=FlKkm%-ZR&xvlZ50^(?2U=SGOHyzY-T>1R#j%W z^F{@fTIUfHx|O9o!}|f~xA5aWz)vwjF7NmlBhkjW9bBu#xv=P+yMYt0M5!x2mf>=w zeJV&SeY{C<`vm6G!b>;il%JCJh=TaPB|-HNcmZ$*@CslR#x8+*56o*?udczo3+4wB ziA!l^n!?Q$PFir$f>#M7t_^1$ntZZq!v#*dfDDMd{~}VfVV;8dm1KyTlRc<+VAX-- zqO*<d1?(RIyA!axu<9bVyN%rq*w+D@1#AW@RQLs|e-Gw6VEzQR2de}W#?^zfeZZ}Y z6n;yH>=;+k(X;F1D+Y4hr*!!*F*T1l>19I{r7UbLf%C!$?QKvU$$c$K;ZE7a3+WDp zV%9fwS6RmJkJ5fZ5<LtOS4ADwN^&PX2l*QQ!V7~!L_u1P92P4^IC0MJ<m@=o@hb2U z=lbuwkRB_uF#KM$^=5;94=P<BpwSaF^s<&YPV-tQfxqnGvnTAbGO(bvdY76VG+xU0 zP^_03rwU;fLn!L)!$E9h{U}OYl$&)M;(pt{W&CBMZLE(izN@%+tY%_3lw!`AP}q~E zMafxzuJl4t-7mD6vjtwse-J&2L?=jemz5hcR;Y?e%2){EPQFEQK)V#&v&M-U`#`lB z+||+TgIMnNRM63aJr3hH84TFBQ-Y}e18=Cg$|WnBMhd*_&^tLhSZ6q-GIl^EmnfE_ zb;I5=9&>nUA~x|&4f1@J2c-n+d^085{0rS?;&P9b11K3!Z^>FGzJudiHos+k7e_Gx zf|^t8P<xk)QA)mz3zWjRy}O<TmjYK9#Z97)Q|fB(v;MSCEz}WE>IFBUqf*LZuYXXK zr#y7j@tEpzJa!pE$Ln5;Q;Ntgt)qz64`G0iY$Aul9T<?;12Qw9D6t~~Jk^R1=)Aj* zpBZ<L=+Kk!ng(86>QgHY4v<sSB?9>Jl0s=ZqMR@AHL-!1JPics&^w0vh=lO57Dv^+ z(G07=Pe#v$I+9atFdL(ZP@{)@;%B4pm-vdQN9ug^dH&VtJ24qy@8O3{QO=7Qx1&Zh zBP{nyo6)JO<rfkW<Zyh7?FbX5gd30ZW*MFwjO;2wAE6`mGji<1y@dX6Bw4bLUm9(G z_mbW8X41cg$dK>xxYFh2l}tUppLjz9Vj7Tu26XF#0H@4*C!`GtA5c~Ybn}Cc@pF}w b|2H$_)%_@<uSwUIwAM{OP506pX}9$c_1&${ diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/_base.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/_base.py deleted file mode 100644 index 223ef21c8..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/_base.py +++ /dev/null @@ -1,196 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals -from pip.vendor.six import text_type - -import gettext -_ = gettext.gettext - -from ..constants import voidElements, spaceCharacters -spaceCharacters = "".join(spaceCharacters) - - -class TreeWalker(object): - def __init__(self, tree): - self.tree = tree - - def __iter__(self): - raise NotImplementedError - - def error(self, msg): - return {"type": "SerializeError", "data": msg} - - def emptyTag(self, namespace, name, attrs, hasChildren=False): - assert namespace is None or isinstance(namespace, text_type), type(namespace) - assert isinstance(name, text_type), type(name) - assert all((namespace is None or isinstance(namespace, text_type)) and - isinstance(name, text_type) and - isinstance(value, text_type) - for (namespace, name), value in attrs.items()) - - yield {"type": "EmptyTag", "name": name, - "namespace": namespace, - "data": attrs} - if hasChildren: - yield self.error(_("Void element has children")) - - def startTag(self, namespace, name, attrs): - assert namespace is None or isinstance(namespace, text_type), type(namespace) - assert isinstance(name, text_type), type(name) - assert all((namespace is None or isinstance(namespace, text_type)) and - isinstance(name, text_type) and - isinstance(value, text_type) - for (namespace, name), value in attrs.items()) - - return {"type": "StartTag", - "name": name, - "namespace": namespace, - "data": attrs} - - def endTag(self, namespace, name): - assert namespace is None or isinstance(namespace, text_type), type(namespace) - assert isinstance(name, text_type), type(namespace) - - return {"type": "EndTag", - "name": name, - "namespace": namespace, - "data": {}} - - def text(self, data): - assert isinstance(data, text_type), type(data) - - 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): - assert isinstance(data, text_type), type(data) - - return {"type": "Comment", "data": data} - - def doctype(self, name, publicId=None, systemId=None, correct=True): - assert name is None or isinstance(name, text_type), type(name) - assert publicId is None or isinstance(publicId, text_type), type(publicId) - assert systemId is None or isinstance(systemId, text_type), type(systemId) - - return {"type": "Doctype", - "name": name if name is not None else "", - "publicId": publicId, - "systemId": systemId, - "correct": correct} - - def entity(self, name): - assert isinstance(name, text_type), type(name) - - return {"type": "Entity", "name": name} - - def unknown(self, nodeType): - return self.error(_("Unknown node type: ") + nodeType) - - -class RecursiveTreeWalker(TreeWalker): - def walkChildren(self, node): - raise NotImplementedError - - def element(self, node, namespace, name, attrs, hasChildren): - if name in voidElements: - for token in self.emptyTag(namespace, name, attrs, hasChildren): - yield token - else: - yield self.startTag(name, attrs) - if hasChildren: - for token in self.walkChildren(node): - yield token - yield self.endTag(name) - -from xml.dom import Node - -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#>" - - -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 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 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/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/_base.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/_base.pyc deleted file mode 100644 index db377bd9f6f30329847976c754ec4a3cc2c93768..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9344 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 N=@}bB-TNuz{sY|tD=z>5 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/dom.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/dom.py deleted file mode 100644 index a01287a94..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/dom.py +++ /dev/null @@ -1,46 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from xml.dom import Node - -import gettext -_ = gettext.gettext - -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/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/dom.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/dom.pyc deleted file mode 100644 index a71a7e7dbb9b59b7474cecf3090336e53d69989b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2507 zcmd5;UvJ|?5Fgt~TBq$bSHuC=0umrDLR=q^5E42eLXtxjcTVM`^corYoOqLLy0(LN z6I!YFbVz&xJ`mrAcb<`$87ED|6XK;;Rnyto+1cN3{;cc#wO9T9Pum~D^2foy-@dd# zr>MmEYk>ktEa+R1*wD8jaiH&jMSC`=5+r5lmy5LnssjBAhzd+m*@CzPaT(M$Brfz_ zbizFsrd1eO5O2Y+0IvZq`a2Li(5-Ldm6CAO35D555e;;v=0=1vnPs^#<Pyt;)G|v= z4HxrN4zpN<N*a+zO4ltqT0-HW*^{&^Y-QBKL8OJLqSniWIFHn&$Zx5W>vu%`b5sNn zV<d?fku;`(6o)vIg1j77%HVhFB|I>+QIJCSG%3sr40vO~6!D<6;nIfu7>onc65Gox zD=fEQRD$l>dz;U=Fv4RM$S?R<m0fqpxZ%3Xf&Zq=y|UqI3}%o0?!k1Q()-$i)=#JK z%3*5_ZX7bv5|P}8{0~+R;Kp8B$o>{x^5o~=)_XCM!Hx22<D7`R%`xw@e83Tq={t1m zsJw~sUB>vKMQ7e)?|-v+$b=79gj?)-M19hwL+|q;42#qeNta9N)jz;ob5EpL?B4ZE z_}n=MXl`|yXV2SSFYH~MwnMMeYWq|jvsLVomD?nZ62T#6^MR7Xlb9F!S{sqz!bSI9 z`$dl<7z*5MHF}M(+ivzwI$mL>z~sc<1m(v_&4t-TbNgAFQ4j#WPf2aK10!Q{Il$i5 zY`+wEC3W;zn8s?0dYHoyN<E8);><rW)L{$0fzYXJ7%7if5DYI%1#?_pe48Ei*h7y= zq?;3|Vv4Ofc(e0-jgj)RG+-lb<dGRX*t9(L8{e-F(rB)d&Ir!DAH2@F$J4>sv``~f zC`HVIa!}AGt&S0ZMe+K49gL-!%m=}_OdD#Hi+DpD$TVn)!F(K?UYkjlw$nxM#qn3c zGdTz}J_e65TbI#T=wK#i!9t{QmIo7)s4o?I7##m!c>Hw`XUXyG+T6p-G53^~mN1c2 zn(C)NAyC$Vbz~n}HT%G-SVz{r<>LAwTFFwwovOq0Pj3J{BRv0<$zq~c?Mho*`;kQ2 zT!lIv@joK*F^aoQ0o5B*@bnhlBQ$722-bh*w}alPxH4Ud^OTO?D1xgRui<_6KN!;Y zV;1Ei<z{)K2resldW-JynqR$wI==^DNbgA)axaEqlErg{OaD`J@TmoTN{dh5!F5C4 z)nNMc+)-2MZ4?#DJ#-z{snc*S@sH+ao)dmFflou`Q_u1vbd{)M9Pr}1Kog1mZLs|K zNydK%3<@Z|3-q$#<LQgxJlAp|*8d<dfV<BFSMEtst8WOsranBfYxb_?+BN4N`ub6X diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/etree.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/etree.py deleted file mode 100644 index 8d19f7db5..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/etree.py +++ /dev/null @@ -1,131 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -import gettext -_ = gettext.gettext - -import re - -from pip.vendor.six import text_type - -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): - """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, key, parents, 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 type(node.tag) == text_type, 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 = {} - 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: - return parent, list(parents[-1]).index(parent), parents, None - - return locals() - -getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/etree.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/etree.pyc deleted file mode 100644 index 2dcf5b23a118788a31a0c35cb40457fb6254260d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4626 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 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/genshistream.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/genshistream.py deleted file mode 100644 index f559c45d0..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/genshistream.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, pos = 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 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/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/genshistream.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/genshistream.pyc deleted file mode 100644 index c81e558090c649a90732f1e9fa8c21f0b6d0f061..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2601 zcmd5;OK%%h6#ni^V#lw<c{k7%D{si6QiX&HYDmmOYTPifa657}j6FBW)bns=uH6LL z8-ifNmIeF}{sDgiHY`|l!48Qv=bUjVAazac%$@VP=bp!Rk7NJQsDAg{a)wxZY<l1S z+(P~n5dr-vL_n<ID#R9C3$YE?hGLzCXbJH$+~tC|g)hM^Auhu$BVK{Kg17>=g18E| zTG%a#T@7vxaUE_QaRY7x@haR^#A|TZ5I5mA$$A+<3DG*@4Y(V`ml3QW+C;nscMI`0 z+-;Ippf~Vz2WJXF6<+~2z+-m@K@F#^I%N`adM!@QtkL2R@-&(l?S=6;&5T(gSrAUc zJWLbQBxaI?!!*!d6dIlRQQlI#b(xk=JASNNObL71J#e~)9k)A2ra|vV#}B;D!EyWa z<lwMv$|N~@c-Vb>(l$#(ciWG;tr8J(rtJ1Qr-miufXNz>h5Yd7pnG5{3su2c#GQO1 zZVw+GAGbT*kVAVJpEvMx9kN-A7sJ_4(=cd9I@XEFO_c-*<&cm4p)S~NrghJcMmigk zQa<eT1IED{L}+mPspC{xLI7cc2^-F-oH1l$PL7`;Z~B^u0GKOWeT*6KRN?5!dzf38 ziJwsg*+;l~OLQWfS-7#tsD`<XnT^lX<z4g=fE48BvWecytzZ6YD;@OTtz+3ric={} zr|3L~*GUsCjWCq6l-;Bwo#ZW6iXzw1nKWmd>1miwa_O_4Qt^Zm`xaS4mi!q}!MpwQ z&|FLg{a%<HL}!@}{y`1Gq<^Fblk@(`wYf->b~5eX*?*`1ARP2_0@&NsiIIP<^Zqy- z_vxS@&H5K6j_yWe!GS)L=H&fziu5APN#w`-<7)}i^BAL^$Jom^I4-NCnyRk$=&9QL z9x^^x>0vBMgMO!$Q9b)MmwUd1`7#&X03!=oL(P`Zr@EIgFJo5X_RUv>AYp|s)4YnS z2bh(qV@G02eXE1+!K}trq<&;yU{=Sh%95wlVp<i>EZn>NaG{{~kaQvH%_^XF5VZC< zgg-G`0ik?UV*2Wd0EI%Ru$-M*sE>c;7Y(63x+5bS3*N>ag-ra-Qh}!iW(~&EZ|Ge< zSBys5|H9D?LoNA5vL`QebceHFWK4u)ya=X@tZ-0UIG{Yq@pF~@AP(x{U?gYIsZ<BW z-shrR73KHpDv@N?7J7mFix9t2z2u=-H^ur#akb8---2D;5#<JGNSRHTEtqYX9hhC5 z6~+2lC9C597F){sat#Fg6J8luG7gKuu}30@<uYiZbm&Js9fbRPOvuon>6qlkPlnoI zJUN@Ztn<PXQ?RJxvAOR0=Z?%ro~pDVGbE9#M#yF*BT**UFpYU8Ic!*5N_}M<9+{#J z(xJH?YlnxU!_akjb~!vC9Uf~ALtZQ=$tX#mB`x;s?C^4nRh(8rE`=C{Ngzbv8(${& zIL+m4C_FyYHzo@Qd9jUZ;M`^>oZ&D{raCh^@Lt&P$Qv16rw*6!^%w}wHihygJ^6iF zpw?&v)K!JPCACT1p0#D&RvT)UzIAKYDs*+l)H*#oBxP!iY;3!jiQF8|V<>o@;K1|Z zG?+xhI{f1xXTD5dsQ+^)Iy?gz9yzzaq$;bO)-F+t*v}?rl5y-Lg2N4T<ad%$RgBmD zVVW%<&K?BI1qK-;0@hcevA{N&!QuZi<Q5Tl_}Z9U?n!ZDIL6ngW^#G&6>WW=Ym##T PZ(B{(Qu|iZ+OhuvrwA-c diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/lxmletree.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/lxmletree.py deleted file mode 100644 index 66969ee35..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/lxmletree.py +++ /dev/null @@ -1,208 +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 gettext import gettext -_ = gettext - -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("utf-8", "strict") - - -class Root(object): - def __init__(self, et): - self.elementtree = et - self.children = [] - 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))) - root = et.getroot() - node = root - - 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 - self.isstring = isinstance(obj, str) or isinstance(obj, bytes) - # Support for bytes here is Py2 - if self.isstring: - self.obj = ensure_str(self.obj) - - 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): - if hasattr(tree, "getroot"): - tree = Root(tree) - elif isinstance(tree, list): - tree = FragmentRoot(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 node.isstring: - return _base.TEXT, 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 - - return node.getparent() diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/lxmletree.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/lxmletree.pyc deleted file mode 100644 index 69a06c9b7943ce2d527cd33977a6e2270e069873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10348 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 ZOfJ7Dna1}eC=1o<{0sAw^VRv+{tdVCN?ZT{ diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/pulldom.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/pulldom.py deleted file mode 100644 index 0b0f515fe..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/pulldom.py +++ /dev/null @@ -1,63 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from xml.dom.pulldom import START_ELEMENT, END_ELEMENT, \ - COMMENT, IGNORABLE_WHITESPACE, CHARACTERS - -from . import _base - -from ..constants import voidElements - - -class TreeWalker(_base.TreeWalker): - def __iter__(self): - ignore_until = None - previous = None - for event in self.tree: - if previous is not None and \ - (ignore_until is None or previous[1] is ignore_until): - if previous[1] is ignore_until: - ignore_until = None - for token in self.tokens(previous, event): - yield token - if token["type"] == "EmptyTag": - ignore_until = previous[1] - previous = event - if ignore_until is None or previous[1] is ignore_until: - for token in self.tokens(previous, None): - yield token - elif ignore_until is not None: - raise ValueError("Illformed DOM event stream: void element without END_ELEMENT") - - def tokens(self, event, next): - type, node = event - if type == START_ELEMENT: - name = node.nodeName - namespace = node.namespaceURI - attrs = {} - for attr in list(node.attributes.keys()): - attr = node.getAttributeNode(attr) - attrs[(attr.namespaceURI, attr.localName)] = attr.value - if name in voidElements: - for token in self.emptyTag(namespace, - name, - attrs, - not next or next[1] is not node): - yield token - else: - yield self.startTag(namespace, name, attrs) - - elif type == END_ELEMENT: - name = node.nodeName - namespace = node.namespaceURI - if name not in voidElements: - yield self.endTag(namespace, name) - - elif type == COMMENT: - yield self.comment(node.nodeValue) - - elif type in (IGNORABLE_WHITESPACE, CHARACTERS): - for token in self.text(node.nodeValue): - yield token - - else: - yield self.unknown(type) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/pulldom.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/treewalkers/pulldom.pyc deleted file mode 100644 index 2d26b81ede9a09e4ace0983bc70d116bf9b5cf07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2520 zcmd5;OLH4V5boL4)0Q2Rn1>;Nijyw5C<+QH6&{Mc5Ld-YYAvEdCD*djj-8G6A@9yQ za+P!l=FW)=7j7Il@Ef@B8{j8UT=@fh-IDEuKM-tr)ZNq5kLj;_Z2z;i^21-2JEG-} zjqlIDu_%8EBEUycL=-FPD~c`ZTNK;Ww@LAyMNx_3GWE+8SEyg1xJvyh#Wm{JD6Uh# z4n3QK5=AQ%uTp;%e3^m@MGcDAsJ{ljN_v$ZuhWsDphn*jofCcCU#Fl>2dx!E5prlP z4$NG`;t%sQDvb8Rc#>wu)F2DO(=ZRy#B6{ml5ms;+KWP?Ge62(Wj?xw<)GVkyPk8; z*>^f!vkHmR*}dee;CJrt%ibpFy)QfW-S(Y(j@P@p*L4maw09iC0qxvvyX~E>;~s<x zY>OAePQ0O?>(IKCH9(!FVc<kM)``jGbT`ww=SO3mU0ymHxWkwJItWdC*SKC>1+E(f zV8SN%pv9I)tjx|T%<!Q)Bv7Brp}9rVA8AJPSkdm`_cXU@1|vk{I%Pl6Oq9ko%6CPs zXbU3nyeG~s_`{{mglPJi7_?YpX4AO^%PpFhXjY<!3JZX+g*uNd$|e_P5YEYjKRsB$ zDFk-%3iYl6`29k28NlB({p89IA{IZZmwrzEgsC?!GC($EWdvL2ioR6@FF11`#qLO5 ziV|+foK1AW5OLy(IqUkz#ceQqQFN4Mu@0KM_xGFn6vb)gCewa=tH}jx>P5wxPeSu3 zEll$noV3I&FP${eMmUtza6L>q*2$vG5B;dnPL`$F0)MQR>*&ZZD8l0;&9qk}CX58Y zlT4q6X^{(zBp#u}UJD0EmOKL$+!`Dss$w|kg-JU)%5?AyH4Kx%t{xW0g9m2_J#muL z!TZ}E4eo`*L5_xacjAx6{;|#nlW;OX;z61X9+^1$FoFiIKtB;|V!w!@AdR;tXA+_3 zaXWb)ho8U0A*l*}H&jF2#9CKds*LYVwE}(%(uNvw&vL_XX9-lF0;(wYz+zl7fNU~= zCUElyg9(_OmxX{rg&TifrKv-xGw<S4=IMZf?;dW`ye85L&1x)SwnmSuG{Xl3u!^-t zM;6^a`2xr*ld03VLfLOL-4~>-&<v;H5hpBaOn$k9WQqIbyaYc0V4Y@l0R7}w>YdCL z_txsw!E+m1$<LBXLsEH-TjD>dES*;=TNqed8UV&&c&-vH2G+&E$KvCfWVgYo!GR<D zFOj*<32_#wn!YDl+_+MFF5E-aOV&kWlMjoXfLnye$f8ABFN1WsOj6?nW3%JOS}>Y` z$blC9mAfY>kHXx@1oMr_!XZX*F7mNH%VqE$Ytz2i>cEsh_>}tq7f%$WBR^vEE_32g zFPl=B-1wP6hq}^I+)h9z^D@5$Lut%&RIG8V(qk@by1c#UMLji!xgr@S>61jB5SJeg z_xgoS!aCvw(?JNfwjeltj_)#k$%0c}WXqI$0}3y^EnR-n-o{`40Tz;$tD_MsXuxag zP2p{2tG86cdev%Rrw$oYo7Q!1QF}4UcshC>=j(Y=U(buvpoqY_{0@qrt88E7ByxG0 z@VlLJ^(v}<qtoKjF2g=5Oo6fLxe$@d52edkmwy|kakMStY%$gZ^nx^j*E1lJvwSB4 lgHeik?&Iwi(2D>6$5lwn++GywQ%*JKm~UDwd&AnW{{=a$G?@SZ diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/__init__.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/__init__.py deleted file mode 100644 index a8cca8a9a..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from .py import Trie as PyTrie - -Trie = PyTrie - -try: - from .datrie import Trie as DATrie -except ImportError: - pass -else: - Trie = DATrie diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/__init__.pyc deleted file mode 100644 index 50ba945377db71d6da0cd10e18f93fa884686296..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 479 zcmYk2-AcnS6vt1}uA7tTgkAaoy>S<U2qNOZT?ith3eysZ?UHR_X<E{B&<F7yz4rw? zDH9Fkm;d<)=Og$Y4L`qVvVz0u;d}o<p%y6c3IZCSAdnI$D5MmM0MY=6pdbR!Arw7G zBOo$@v<K}34uO6b7ywzCGYI7o?1o_9fe>Q)@FoX7TZHfu`-;j}j{}4|MPzwh>c&Z~ zimJ5E4bUglUe&5JZj44_)T$JcYvrWPbgc+FV-FW1UagYP@z9$doUa?#Sjl;U79>6| zp$O+uwMkbvLcM7HSLdb3+^>9?b>3t2K6VYwtu1YgCj6nsHG#Nc8|Ai5&X&r|^x8`C zPvy$62bnh;wrJh9G;_0Om(y$Zq;gi{Bo|e-+GQJAvr1KLFO4WI+qyzuY0U8LFwT`x gj`L~Nc3ZhEO3`R}=SQkf5a)DEBN~ti8Ih3w0D?(uga7~l diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/_base.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/_base.py deleted file mode 100644 index 724486b16..000000000 --- a/PythonEnv/2.7/Lib/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): - keys = super().keys() - - if prefix is None: - return set(keys) - - # Python 2.6: no set comprehensions - return set([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/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/_base.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/_base.pyc deleted file mode 100644 index 9a74990b8a6d5e89904e95d9f4d6d72f2dfc0862..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1973 zcmc&#?P?r16up|+U4O)m-MA%~Hn0#vhCm%Cm_S=f(>nRnc1dRgA<HD{?2L9Td%i4b zTpOG}bzY(GnE!c!o~s$0j|ZriUCot7(mm(gBW?J8bN%0UL7Y+l3Gw{-uYl}R1UbHf z3ZhcbOi&rnETA%^SxAE41yl^E9MWuven@Ia3qkpS-V$9By_}6GAJQ}$VJpr1N4&e+ zLX*yIU9?U~T{g9GZWUv>KGjy&mD@(At#nrBN*3BFlNL4-ymST4A8FI*YUu`upBt^N zpa&TEg`w{wP{fD<5{Ll;G~R;4fH4Cd00S=vfavkgRw(X}ws)}n@!UF-W^O!Btr}-V zYVCMYo3TSen{g&iKg91>&iE$+=Sd$4rv4_N3!nXXmCQYIAzcJ?DQJplN!&Sj^)<c0 za7af3o{N{}A$MN~bn?*8^^_+OCvn`^wo%5@K33<}2a~!|*b?uQbL;$csd4si?G7Ub z=qFiKEF9OMF>0aDVh$b4c^07|-&n3s{(Z8<%66W-(ADE&VO0K6G}l#fpyur|d3Np& z>*`5$ntZqSDEVE_6N@T++oaiXx>Po4bd#K_Dz8m)=*nWhzzh~Hk*wxkbM7ImA*1EG zlh_J2#CqsuWitHpvhE=`yH6KHM_$~6SG!)?fFN@(+9tVxrYD>90zyoC&6vAS5_6W` zDy{M|K82f<cVf(n#W#2cr-Z84C5ZbH`43Yoxw4YWC%a<Z!gw#zj@S~b!Iel%(TnsN z0knWf$0IV^98b@FU^~L}sB@<i;@g*OyK!$$c<{!!U-ZClzys5h2N2S`7mobLdw3eL z-zS<a)16>;qe-h}=e<Hz{`~%?&Yu`lo6oi7b^6+ry@~8a4XoDnn(ku6ZlEEtAqK%% zd?7YJ=z3*7z6LtybqeyC#@C<T-32_?dyVPEU!nP&H(ypoSH^2&zrz?lVJ~r1%exr1 z>>!*yF^TvT`VvZ6rKOV6-z8F(b>0@-WhzqUbtYxZad)=(p7zY++lW4J^wIx(qc9o1 z*esvvkr)LVYilcO>ywD#_H-7lYYphc7^2wMjh*fI2FU87P?^KukB!*^F>iRSlzc&c Q>`L$xgY^abCfE-D1E4L=Bme*a diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/datrie.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/datrie.py deleted file mode 100644 index 1c3b43202..000000000 --- a/PythonEnv/2.7/Lib/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/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/datrie.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/datrie.pyc deleted file mode 100644 index 49beb4d05a70057a8f6b203e3b30ccda8741eac8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3185 zcmd5;ZEG7x5T3i!t7A7#-K24oHl|Q22=#|TDTGie$N5kwB3uHd;==Z%TiGk$i+sE1 z${>GeoxjjO&|lZ@{R4ewPKujCOCeB2x}BSSyP0R_+1U;L*xLB@cRw7{@)zL!?T<d$ z36unnM=4R}(a@vJr=d?-K*NAM?(->aP}ZbjtF8x>wkhk-u!DL-`n%G<fqIkl22DIl zTJ(zOis*-7lae+)?{#3xu>BrecQ+y8kuB27X=SomQ98#%5_4{>DRQ@sN|l>&k!Y0~ zr^`6CJ&&h0AYPP4*R?J;>A6$xVx|ob2-(0GMSecy0b`AzXkv&!1?PYgxLFAp1S>!j zhytG*qO>UK5>UOu+H{tvhG=O^?*=6uQEpK9yte@ZV>Z`9X`nn|v%f)cvJ{s-&7aZ2 zqp8O$bNKRrE(3BtEg%EB!r(`Y4qjb(^ovJ1(fl6w9=_b6%LXlcnl@?C;BN1%Pe*5W z=*YoEw70nz?RXYMszdY7#Z<R8wM&uD)-Ew057D&4AAWrHGaV&_@bH=qs=JW=G~GMZ z7j`eJtlJyuJ?l!7AKMCjBp~4|k=0Hj!9yKGN7!=f;(V+_2Jbj9FA$TbWr^VOlsHM? zEs*y)d@_4lnA|ndrjppjq9N9q?eRDnVRbqY<@JE^NnBd_AZ$w)x5(V{IIVOKQ%QuK zLQ5V+$Htvhqv*)w{d7|5<S*LD<k6uXRmah@3wKiFPxJHW%l)sT@69N(aOI0xJU)$& zwT)(G7M<%nDaz=?W$9NbMqp)h1jq2&pIr!nl`^?;O7W7|_t_P%>+N_q@!#@p`**!v zPe{T<;UXm2f&yZ2T!>CvhzApSATr#9+T)?&dn|5o6=gjT*%_tA*q|}Ot<)XVEjvfv zn0@B*1}t!&VF@!=uy}w3Fx7btPxdXtTOYDEtSbeNl-h;*cTnu%>sZwr8e3HM4tLeD zayzUR?z?Q3>P+WOCqn-^kn6?QfomWqGO1Gcp|1dPFjhqX-atdmL{M^f6*Gy@J4HqI zQ>kO^IAbXF;NLLuX;NbX69Efpas`aB3kgHcIoBIaQq`=~6Ej~MDaEBv-xiqr0ADzX zt>Rp*enK)-OI(6ovdTTij<S}l5;7k@L-|Ke{+IYU29g#zlC^u+0Din&*|!78+2u`u zyq~jc&W7s^<0tU%A<7cvpvU=Qc`D{{rj?SLf>K$LR4J+<Gc&x+;zJgkc*Bn%<X9gR zxt1Lu{0MmsLpE{EQ_=qCQ(mr@e7TX+z2$W`yFvZml=q;=iD?ORQn{*RplG5{awzXP z$u0H0K|UAqZ9({pTgHBU%h<POUf-nTel&`4<Ki=_fAEB_PwQO-3F_lIjNdRU+kv?6 KZ+qMRcJL?88}n5F diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/py.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/py.py deleted file mode 100644 index f2d364113..000000000 --- a/PythonEnv/2.7/Lib/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/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/py.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/trie/py.pyc deleted file mode 100644 index 849449d6243301b215fde11533df68cd5247edb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3388 zcmd5;O>Y}j6uoaecI?oSl710dXebi0ga`-;icnS2FBS*|G^wbtj2>gpb27<z?9O{G z2}(A!Yj*qwB>ojU_UsYo+=-JEv0{NqJa6v2&wK7Y@7~+^<NWf^zemYXj{h2XfBIb{ zegq-I&qyIMHqtXPj-(gKxFNlU7>-3!#4>J5uUUULq-e=_NqS58jwNeK(Ux&Xddv83 ziCdPDk!(qxi#!wgrq_|IEnD3Vj>>s{m#2pnH0i)kidk?rA5SM$2yOIb`P1CzlQLYu z$E?hUlg!y753WiJ-!)vyor2pBHXKY{-SrZ>2Dx{`U<)@2Ip@_QF{DRT?vf^i69Yu} zxJLtg4#5d=11dBIbQps|gUBfWVnc<dWU&e@!UOK-Fj!lFnbSIwY;}oX$j$i>=Y1Zs z2O+4HG4asIuAyZfJj2U~e@6lijVS+Uq|_OQBDNtRKAnwGc0z}S3eX{zu*3-%8b#U( zWdx=s)XgDnKs91Ko@%@S0egIVNsbKl!P0=$k$i2Q04-N?&1RRY!ZI3oqVypxhb|$Q zdVr%F?_;INeiw~sQ&Z`a{&pUAW`q9Yyu4eCDwmy+26@?k;0Ckp{#OTKXHq^apY}i4 zxYhq6AM`yu{O&Xz?xow#_ow-^|J0S)r0Va4aq(e+839i0PY*Vx2c87Dz3oc3KdtW2 z^`1JlWcDgvcZ*_u&mH*n@yv(yfm`=jS#J9o#*PW71R|icC}3j|&R1GJ0;3*Q705^% z+AIxeXhHJmaarAYGT9E(;f}-hfqNCM4ClB=d#97U48As)I=~epJ&Ic{#A<rGtj)_j zSWD-6YAfctS&2I4vgw!;;?kN*-188?5|CyWMrxf9guYL>TmdGlkkke+&0?^r;q4G% zBL!ovy$Fqz6k_xq%<sYpD$*aQ^zxjgeZsI)LsO81wirlDIN2hamDXPQw`i1cjGg}r zL~TVxb*x=G1BrB-Kk6V}>6&vO-`d<g|3JFrGG;EuJ=D?KZ5M!NZ0&V?&Iv~>^d29@ z^Ctu#L4@6Fi@&L|kv)WD$jZWV)qBhWr<BC>T@CcRG2?qR(XpoVBRRqkxuJDDoA(nd z8}clc_$Zd6rj%D+7)FFY9>5VuJV#hs=Z^UefGX85a)=AQ|M7g=rmRr|y&=_a9NcZ6 z8G};h5ZNe_TR8E_ukx6Rz$VC9_%-J#sj1s)&fly<F#V|2fU<LQQo7`2bZG$bE@<LG z(y4;~9=Rl8p^&`7hH+Hyr%p|?tV;{m(T72LTDeia4~z)L6MgOE8nSgaO;~xt$hQ#2 z=*c&5y5?aqH_iEI)vTBs(G`uqakOSGnU^82L>h^if%qteeu7XNxQ@itMdt1;bnVu( zf&W31FV#cw8JfWU@G?Aph9+Q1xhgQt$q*=l&Qn&jxEopVgCK8g9nXtF37qyq&}1&v z=%U_yRLxxSI=lYnHhQ@B9U*;&TFz;iqTWkrmSmmHn{3`fvk)JJOE`Ha^_Dr_l76-( z)ko;}%mo6E#p<_f(Q0%V@@AKmI?k?TI(F77g{>V=vRQ%8gu5mT;>lGujD5*#Y_754 z^5ktar;t_p4=XAyj_FBHKebG!(`nTI=dNyc8S0K9jb>q15fZv2(TL3J7Pt&W+eTfq zZTNg&3r4M->bhKSZ(TqQQeT(jC|^;p-Mi2Fd~x8_b+>D0-6163MswX<i16R|3*uDr A{Qv*} diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/utils.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/utils.py deleted file mode 100644 index 4e8559db6..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/utils.py +++ /dev/null @@ -1,78 +0,0 @@ -from __future__ import absolute_import, division, unicode_literals - -from types import ModuleType - -try: - import xml.etree.cElementTree as default_etree -except ImportError: - import xml.etree.ElementTree as default_etree - - -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 type(name) in (list, tuple, frozenset, set): - for item in name: - _dictEntries.append((item, value)) - else: - _dictEntries.append((name, value)) - dict.__init__(self, _dictEntries) - self.default = None - - def __getitem__(self, key): - return dict.get(self, key, self.default) - - -# Some utility functions to dal 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__ - - if name in moduleCache: - return moduleCache[name] - else: - mod = ModuleType(name) - objs = factory(baseModule, *args, **kwargs) - mod.__dict__.update(objs) - moduleCache[name] = mod - return mod - - return moduleFactory diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/utils.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/html5lib/utils.pyc deleted file mode 100644 index 4c2832925eb1310225f22a2c08db6189a4d5c68a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3434 zcmc&$-*4PR5T5m2E<c*IA+-5{O0iObu8`)T2vw@uLTQ3j2}0#m3WO`hXYbu@;<K;b zb=s8VsTFNsctGNj{|gBuUU}yafN#dvUQ*uElW)8`JG-9!=G&RA{WCN5>)&1w)9^Qj z_h&zNWPd{=!J{Z8>MPn-)c0uHqkfIHYovJ0qqI)_G1?v@wLdTBHA)+_Gfq1bv^_~% z*+r`BDcYT)qDxB2ESQ`UlW8`|6n&G_NzYJ6Q8GqPiJlOByM3CH26wj4P%<u!SxP3P z@fIaD+H6k3L&I)2YY^@XMAWu<S~?w?{va=$n}9Acd&ZhPbF=7_nThj6hpBP8h*H~B zJar1<t2`-FeQ$rDH^lNQ?Rt5#X6ztxaZeYo5b|LBIU{rt4Gjn3Hl)W+0j;Ni3Jp&@ zty8esti!Gx;6rOBcK$=-dj1vP4s>jy)E^Z2Ko`zvdu?jU$M5URH<@uJa`1V@-_`rp zcfH8@QK9|RSZ7y!tDW`p!gu8$)mBF0Jln%MI`LgD>-5Xi84On|*xZleSX*ndt{-Ll zex7MR?_g!^1B$-IN2QY&rfae&l{NTtms7I~)Ao*r^M!V0k+DPC?=vpE++LKHx^ljs z_&5C5k!$|gT<+xg@`}IQj*8_=*YJA0e0ZsHGx<&i@B24y@c859YNcC#qB{}xP%ZC2 z?3uXd$5H0DHSZrT6nWY0i7PKnBj*a!M*LT0?U+N=82)c_$bLbmOLXYbqm&L5t=&(k z<<Vh{4(sHI4r=s7k;CJWtC6cyr%t;KD!!*jS9x^p{t_LI(Sb)hka%F>@f`KwCT%^K zc{x%$Ix<6BP7cKZz5r`aP7gZaBvWToNVw5t7UGK#AfYrEf5#_M0_~Xaog#m%GXMbh zi1^JLj0OXpB{C-g$%OY|$UF)|(QY8#ZXA|FsG2-WMyyUd@(rPZn}$B*HP$m=sjb*# zQD2LVgj!T=-GnWPu-FDA*IHeWyKJ|%Om-{n6goN5YMZRJrrTw=b$1^pD_hU@T31%D zw!Sp&mc?q92T{Bmb+v5`%%HW0?c_zP=lba<DJ)87QoB0X57@s&{4JkmsyEcz>Vle4 z?|2JpR!P7)=!~KSd>#$Nbw?3nFLDPF;Pk;Ke?wA7aEh%M&#rdCX}p`fNWd9I)HsB1 zV6Tqd3PbqBV29xc=vsD+ROO8@V?vBLLI^ceC=C0O%FyM2hhdV(VJN@_3s8)9BCV4P z9S4QCWaUVnYIxJ9V-5oU*;5Hv4-Gzur~=5VigrE9yL=*{K~h~}ZH;!v{;$PBRY$aA zm2Km=?NB?;wwq1HZo@F7Qb!E^j@G|_K(J4S{^agoLplf(Qk}^=FOsTs@TQW;MI%&C z3{a_f#%`8Hk#{4f??$G$40i-yQgdoW3BJ6)R|nz>`-}W05RU*|OzL!YVW@ot-QvO_ zfM=vQJ{tf@9Yu;)9U&!n1m|H`ot}5ml0+2uq9R1*coPswsyGVJz5F)n{~$M+`xp)m zv075+Mp!XkHLe!C7wq|kqGv?U6lZ!s_Y>;J5EZuE5R949jPZLs?*$rw5~M}00bMW& zv_;x4n#^G^8Txq?oot55JnEysJO|}bZ|-md-K9;YzEmYtsOJ(jPGcVZtfUatX$Ozg zB78%k9#s>sqqUiEabdSMN(d??p}cRyP87Sm*tf6stD?X;1Q({vx+sfvz-cjH7=t6} zh6@Dp3-7udfc|<kwH;Yq-KC^XL`Bz%-R?tf26LDqCkRPO3~;lsLKw+bL(e4jRcY*Y zgxi-;=j0C744kaK{zZk<r%>3l5Tq8>tT*FLs|oz)P;;h+$(XqiTw?JNM8)-y?nCHK z&VTmwnE%6VTxTyhXrvn6+?l2XqpBI55;r@Pkbp-6PJaP=U)?@%AF)CN$My74KV8+X z(0VmqPjw#|@g6#2DQdYx92;UhhZm2qGGXT3kvsZ2vRC2G9b5P4vTS*zFSR;gP6roQ p_$*c+M%m?r$ufbDU$4-<$+%fY^}ILh)zmz0CiAuV<;lk6<bT9ZK}rAs diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/six.py b/PythonEnv/2.7/Lib/site-packages/pip/vendor/six.py deleted file mode 100644 index eae31454a..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/vendor/six.py +++ /dev/null @@ -1,404 +0,0 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -# Copyright (c) 2010-2013 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. - -import operator -import sys -import types - -__author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.3.0" - - -# True if we are running on Python 3. -PY3 = sys.version_info[0] == 3 - -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) - # This is a bit ugly, but it avoids running this again. - delattr(tp, self.name) - 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) - - -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 _MovedItems(types.ModuleType): - """Lazy loading of moved objects""" - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("reload_module", "__builtin__", "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("copyreg", "copy_reg"), - 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_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("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_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_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("winreg", "_winreg"), -] -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) -del attr - -moves = sys.modules[__name__ + ".moves"] = _MovedItems("moves") - - -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__" - - _iterkeys = "keys" - _itervalues = "values" - _iteritems = "items" - _iterlists = "lists" -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" - - _iterkeys = "iterkeys" - _itervalues = "itervalues" - _iteritems = "iteritems" - _iterlists = "iterlists" - - -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 - - Iterator = object -else: - def get_unbound_function(unbound): - return unbound.im_func - - 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) - - -def iterkeys(d, **kw): - """Return an iterator over the keys of a dictionary.""" - return iter(getattr(d, _iterkeys)(**kw)) - -def itervalues(d, **kw): - """Return an iterator over the values of a dictionary.""" - return iter(getattr(d, _itervalues)(**kw)) - -def iteritems(d, **kw): - """Return an iterator over the (key, value) pairs of a dictionary.""" - return iter(getattr(d, _iteritems)(**kw)) - -def iterlists(d, **kw): - """Return an iterator over the (key, [values]) pairs of a dictionary.""" - return iter(getattr(d, _iterlists)(**kw)) - - -if PY3: - def b(s): - return s.encode("latin-1") - def u(s): - return s - if sys.version_info[1] <= 1: - def int2byte(i): - return bytes((i,)) - else: - # This is about 2x faster than the implementation above on 3.2+ - int2byte = operator.methodcaller("to_bytes", 1, "big") - import io - StringIO = io.StringIO - BytesIO = io.BytesIO -else: - def b(s): - return s - def u(s): - return unicode(s, "unicode_escape") - int2byte = chr - import StringIO - StringIO = BytesIO = StringIO.StringIO -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -if PY3: - import builtins - exec_ = getattr(builtins, "exec") - - - def reraise(tp, value, tb=None): - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - - - print_ = getattr(builtins, "print") - del builtins - -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 -""") - - - def print_(*args, **kwargs): - """The new-style print function.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - def write(data): - if not isinstance(data, basestring): - data = str(data) - 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) - -_add_doc(reraise, """Reraise an exception.""") - - -def with_metaclass(meta, base=object): - """Create a base class with a metaclass.""" - return meta("NewBase", (base,), {}) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/vendor/six.pyc b/PythonEnv/2.7/Lib/site-packages/pip/vendor/six.pyc deleted file mode 100644 index 69a37c55e76f2ce7f5e2c1f605700961b148af9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15686 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 diff --git a/PythonEnv/2.7/Lib/site-packages/pip/wheel.py b/PythonEnv/2.7/Lib/site-packages/pip/wheel.py deleted file mode 100644 index bd22a89f4..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pip/wheel.py +++ /dev/null @@ -1,335 +0,0 @@ -""" -Support for installing and building the "wheel" binary package format. -""" -from __future__ import with_statement - -import csv -import functools -import hashlib -import os -import pkg_resources -import re -import shutil -import sys -from base64 import urlsafe_b64encode - -from pip.locations import distutils_scheme -from pip.log import logger -from pip import pep425tags -from pip.util import call_subprocess, normalize_path, make_path_relative - -wheel_ext = '.whl' -# don't use pkg_resources.Requirement.parse, to avoid the override in distribute, -# that converts 'setuptools' to 'distribute'. -setuptools_requirement = list(pkg_resources.parse_requirements("setuptools>=0.8"))[0] - -def wheel_setuptools_support(): - """ - Return True if we have a setuptools that supports wheel. - """ - fulfilled = False - try: - installed_setuptools = pkg_resources.get_distribution('setuptools') - if installed_setuptools in setuptools_requirement: - fulfilled = True - except pkg_resources.DistributionNotFound: - pass - if not fulfilled: - logger.warn("%s is required for wheel installs." % setuptools_requirement) - return fulfilled - -def rehash(path, algo='sha256', blocksize=1<<20): - """Return (hash, length) for path using hashlib.new(algo)""" - h = hashlib.new(algo) - length = 0 - with open(path) as f: - block = f.read(blocksize) - while block: - length += len(block) - h.update(block) - block = f.read(blocksize) - digest = 'sha256='+urlsafe_b64encode(h.digest()).decode('latin1').rstrip('=') - return (digest, length) - -try: - unicode - def binary(s): - if isinstance(s, unicode): - return s.encode('ascii') - return s -except NameError: - def binary(s): - if isinstance(s, str): - return s.encode('ascii') - -def open_for_csv(name, mode): - if sys.version_info[0] < 3: - nl = {} - bin = 'b' - else: - nl = { 'newline': '' } - bin = '' - return open(name, mode + bin, **nl) - -def fix_script(path): - """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): - script = open(path, 'rb') - try: - firstline = script.readline() - if not firstline.startswith(binary('#!python')): - return False - exename = sys.executable.encode(sys.getfilesystemencoding()) - firstline = binary('#!') + exename + binary(os.linesep) - rest = script.read() - finally: - script.close() - script = open(path, 'wb') - try: - script.write(firstline) - script.write(rest) - finally: - script.close() - return True - -dist_info_re = re.compile(r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>\d.+?))?) - \.dist-info$""", re.VERBOSE) - -def root_is_purelib(name, wheeldir): - """ - 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 move_wheel_files(name, req, wheeldir, user=False, home=None): - """Install a wheel""" - - scheme = distutils_scheme(name, user=user, home=home) - - if root_is_purelib(name, wheeldir): - lib_dir = scheme['purelib'] - else: - lib_dir = scheme['platlib'] - - info_dir = [] - data_dirs = [] - source = wheeldir.rstrip(os.path.sep) + os.path.sep - installed = {} - changed = set() - - def normpath(src, p): - return make_path_relative(src, p).replace(os.path.sep, '/') - - 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): - if not os.path.exists(dest): # common for the 'include' path - os.makedirs(dest) - - for dir, subdirs, files in os.walk(source): - basedir = dir[len(source):].lstrip(os.path.sep) - 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') - # is self.req.project_name case preserving? - and s.lower().startswith(req.project_name.replace('-', '_').lower())): - assert not info_dir, 'Multiple .dist-info directories' - info_dir.append(destsubdir) - if not os.path.exists(destsubdir): - os.makedirs(destsubdir) - for f in files: - srcfile = os.path.join(dir, f) - destfile = os.path.join(dest, basedir, f) - shutil.move(srcfile, destfile) - 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 - - for datadir in data_dirs: - fixer = None - for subdir in os.listdir(os.path.join(wheeldir, datadir)): - fixer = None - if subdir == 'scripts': - fixer = fix_script - source = os.path.join(wheeldir, datadir, subdir) - dest = scheme[subdir] - clobber(source, dest, False, fixer=fixer) - - 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) - writer = csv.writer(record_out) - for row in reader: - row[0] = installed.pop(row[0], row[0]) - if row[0] in changed: - row[1], row[2] = rehash(row[0]) - writer.writerow(row) - for f in installed: - writer.writerow((installed[f], '', '')) - shutil.move(temp_record, record) - -def _unique(fn): - @functools.wraps(fn) - def unique(*args, **kw): - seen = set() - for item in fn(*args, **kw): - if item not in seen: - seen.add(item) - yield item - return unique - -# TODO: this goes somewhere besides the wheel module -@_unique -def uninstallation_paths(dist): - """ - Yield all the uninstallation paths for dist based on RECORD-without-.pyc - - Yield paths to all the files in RECORD. For each .py file in RECORD, add - the .pyc in the same directory. - - UninstallPathSet.add() takes care of the __pycache__ .pyc. - """ - from pip.req import FakeFile # circular import - 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 - - -class Wheel(object): - """A wheel file""" - - # TODO: maybe move the install code into this class - - wheel_file_re = re.compile( - r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>\d.+?))?) - ((-(?P<build>\d.*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?) - \.whl|\.dist-info)$""", - re.VERBOSE) - - def __init__(self, filename): - wheel_info = self.wheel_file_re.match(filename) - self.filename = filename - self.name = wheel_info.group('name').replace('_', '-') - self.version = wheel_info.group('ver') - 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 = set((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): - """ - Return the lowest index that a file_tag 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. - """ - if tags is None: # for mock - tags = pep425tags.supported_tags - 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): - """Is this wheel supported on this system?""" - if tags is None: # for mock - tags = pep425tags.supported_tags - return bool(set(tags).intersection(self.file_tags)) - - -class WheelBuilder(object): - """Build wheels from a RequirementSet.""" - - def __init__(self, requirement_set, finder, wheel_dir, build_options=[], global_options=[]): - self.requirement_set = requirement_set - self.finder = finder - self.wheel_dir = normalize_path(wheel_dir) - self.build_options = build_options - self.global_options = global_options - - def _build_one(self, req): - """Build one wheel.""" - - base_args = [ - sys.executable, '-c', - "import setuptools;__file__=%r;"\ - "exec(compile(open(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec'))" % req.setup_py] + \ - list(self.global_options) - - logger.notify('Running setup.py bdist_wheel for %s' % req.name) - logger.notify('Destination directory: %s' % self.wheel_dir) - wheel_args = base_args + ['bdist_wheel', '-d', self.wheel_dir] + self.build_options - try: - call_subprocess(wheel_args, cwd=req.source_dir, show_stdout=False) - return True - except: - logger.error('Failed building wheel for %s' % req.name) - return False - - def build(self): - """Build wheels.""" - - #unpack and constructs req set - self.requirement_set.prepare_files(self.finder) - - reqset = self.requirement_set.requirements.values() - - #make the wheelhouse - if not os.path.exists(self.wheel_dir): - os.makedirs(self.wheel_dir) - - #build the wheels - logger.notify('Building wheels for collected packages: %s' % ', '.join([req.name for req in reqset])) - logger.indent += 2 - build_success, build_failure = [], [] - for req in reqset: - if req.is_wheel: - logger.notify("Skipping building wheel: %s", req.url) - continue - if self._build_one(req): - build_success.append(req) - else: - build_failure.append(req) - logger.indent -= 2 - - #notify sucess/failure - if build_success: - logger.notify('Successfully built %s' % ' '.join([req.name for req in build_success])) - if build_failure: - logger.notify('Failed to build %s' % ' '.join([req.name for req in build_failure])) diff --git a/PythonEnv/2.7/Lib/site-packages/pip/wheel.pyc b/PythonEnv/2.7/Lib/site-packages/pip/wheel.pyc deleted file mode 100644 index e519273837456bb138a78ce85da853882072beb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14032 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 diff --git a/PythonEnv/2.7/Lib/site-packages/pkg_resources.py b/PythonEnv/2.7/Lib/site-packages/pkg_resources.py deleted file mode 100644 index 36a0e6ed3..000000000 --- a/PythonEnv/2.7/Lib/site-packages/pkg_resources.py +++ /dev/null @@ -1,3029 +0,0 @@ -"""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. -""" - -import sys, os, time, re, imp, types, zipfile, zipimport -import warnings -import stat -try: - from urlparse import urlparse, urlunparse -except ImportError: - from urllib.parse import urlparse, urlunparse - -try: - frozenset -except NameError: - from sets import ImmutableSet as frozenset -try: - basestring - next = lambda o: o.next() - from cStringIO import StringIO as BytesIO - def exec_(code, globs=None, locs=None): - 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""") -except NameError: - basestring = str - from io import BytesIO - exec_ = eval("exec") - def execfile(fn, globs=None, locs=None): - if globs is None: - globs = globals() - if locs is None: - locs = globs - exec_(compile(open(fn).read(), fn, 'exec'), globs, locs) - import functools - reduce = functools.reduce - -# 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 - -# Avoid try/except due to potential problems with delayed import mechanisms. -if sys.version_info >= (3, 3) and sys.implementation.name == "cpython": - import importlib._bootstrap as importlib_bootstrap -else: - importlib_bootstrap = None - -try: - import parser -except ImportError: - pass - -def _bypass_ensure_directory(name, mode=0x1FF): # 0777 - # Sandbox-bypassing version of ensure_directory() - if not WRITE_SUPPORT: - raise IOError('"os.mkdir" not supported on this platform.') - dirname, filename = split(name) - if dirname and filename and not isdir(dirname): - _bypass_ensure_directory(dirname) - mkdir(dirname, mode) - - -_state_vars = {} - -def _declare_state(vartype, **kw): - g = globals() - for name, val in kw.items(): - g[name] = val - _state_vars[name] = 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: - pass # not Mac OS X - 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', - - # 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', - - # 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""" - -class DistributionNotFound(ResolutionError): - """A requested distribution was not found""" - -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: - import platform - version = platform.mac_ver()[0] - # fallback for MacPorts - if version == '': - import plistlib - 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. - """ - try: - # Python 2.7 or >=3.2 - from sysconfig import get_platform - except ImportError: - from distutils.util 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+)-(.*)") -get_platform = get_build_platform # XXX backward compat - - - - - - - -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: - return True # easy case - - # 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": - - #import warnings - #warnings.warn("Mac eggs should be rebuilt to " - # "use the macosx designation instead of darwin.", - # category=DeprecationWarning) - return True - return False # egg isn't macosx or legacy darwin - - # 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) - -run_main = run_script # backward compatibility - -def get_distribution(dist): - """Return a current distribution object for a Requirement or string""" - if isinstance(dist,basestring): 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(object): - """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) - - - 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: - raise VersionConflict(dist,req) # XXX add more info - else: - 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). - """ - for dist in self: - entries = dist.get_entry_map(group) - if name is None: - for ep in entries.values(): - yield ep - elif name in entries: - yield entries[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): - """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. If it's added, any - callbacks registered with the ``subscribe()`` method will be called. - """ - if insert: - dist.insert_on(self.entries, entry) - - if entry is None: - entry = dist.location - keys = self.entry_keys.setdefault(entry,[]) - keys2 = self.entry_keys.setdefault(dist.location,[]) - if dist.key in self.by_key: - return # ignore hidden distros - - 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): - """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``. - """ - - requirements = list(requirements)[::-1] # set up the stack - processed = {} # set of processed requirements - best = {} # key -> dist - to_activate = [] - - while requirements: - req = requirements.pop(0) # process dependencies breadth-first - if req in processed: - # Ignore cyclic or redundant dependencies - 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: - if env is None: - env = Environment(self.entries) - dist = best[req.key] = env.best_match(req, self, installer) - if dist is None: - #msg = ("The '%s' distribution was not found on this " - # "system, and is required by this application.") - #raise DistributionNotFound(msg % req) - - # unfortunately, zc.buildout uses a str(err) - # to get the name of the distribution here.. - raise DistributionNotFound(req) - to_activate.append(dist) - if dist not in req: - # Oops, the "best" so far conflicts with a dependency - raise VersionConflict(dist,req) # XXX put more info here - requirements.extend(dist.requires(req.extras)[::-1]) - processed[req] = True - - return to_activate # return list of distros 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) - ) - map(working_set.add, distributions) # add plugins+libs to sys.path - print 'Could not load', errors # display 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) - plugin_projects.sort() # scan project names in alphabetic order - - 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__([]) - list(map(shadow_set.add, self)) # put all our entries in shadow_set - - 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: - v = sys.exc_info()[1] - error_info[dist] = v # save error info - if fallback: - continue # try the next older version of project - else: - break # give up on this project, keep going - - 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): - """Invoke `callback` for all distributions (including existing ones)""" - if callback in self.callbacks: - return - self.callbacks.append(callback) - 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 Environment(object): - """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. ``'2.4'``); - 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._cache = {} - 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. - """ - return (self.python is None or dist.py_version is None - or dist.py_version==self.python) \ - 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` - """ - try: - return self._cache[project_name] - except KeyError: - project_name = project_name.lower() - if project_name not in self._distmap: - return [] - - if project_name not in self._cache: - dists = self._cache[project_name] = self._distmap[project_name] - _sort_dists(dists) - - return self._cache[project_name] - - def add(self,dist): - """Add `dist` if we ``can_add()`` it and it isn't already added""" - if self.can_add(dist) and dist.has_version(): - dists = self._distmap.setdefault(dist.key,[]) - if dist not in dists: - dists.append(dist) - if dist.key in self._cache: - _sort_dists(self._cache[dist.key]) - - - def best_match(self, req, working_set, installer=None): - """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. - """ - dist = working_set.find(req) - if dist is not None: - return dist - for dist in self[req.key]: - if dist in req: - return dist - return self.obtain(req, installer) # try and download/install - - 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 - - -AvailableDistributions = Environment # XXX backward compatibility - - -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() - - err = ExtractionError("""Can't extract file(s) to egg cache - -The following error occurred while trying to extract file(s) to the Python egg -cache: - - %s - -The Python egg cache directory is currently set to: - - %s - -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. -""" % (old_exc, cache_path) - ) - 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: - 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) | 0x16D) & 0xFFF # 0555, 07777 - 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(): - """Determine the default cache location - - This returns the ``PYTHON_EGG_CACHE`` environment variable, if set. - Otherwise, on Windows, it returns a "Python-Eggs" subdirectory of the - "Application Data" directory. On all other systems, it's "~/.python-eggs". - """ - try: - return os.environ['PYTHON_EGG_CACHE'] - except KeyError: - pass - - if os.name!='nt': - return os.path.expanduser('~/.python-eggs') - - app_data = 'Application Data' # XXX this may be locale-specific! - app_homes = [ - (('APPDATA',), None), # best option, should be locale-safe - (('USERPROFILE',), app_data), - (('HOMEDRIVE','HOMEPATH'), app_data), - (('HOMEPATH',), app_data), - (('HOME',), None), - (('WINDIR',), app_data), # 95/98/ME - ] - - for keys, subdir in app_homes: - dirname = '' - for key in keys: - if key in os.environ: - dirname = os.path.join(dirname, os.environ[key]) - else: - break - else: - if subdir: - dirname = os.path.join(dirname,subdir) - return os.path.join(dirname, 'Python-Eggs') - else: - raise RuntimeError( - "Please set the PYTHON_EGG_CACHE enviroment variable" - ) - -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 - - Spaces become dots, and all other non-alphanumeric characters become - dashes, with runs of multiple dashes condensed to a single dash. - """ - 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('-','_') - - - - - - - - -_marker_names = { - 'os': ['name'], 'sys': ['platform'], - 'platform': ['version','machine','python_implementation'], - 'python_version': [], 'python_full_version': [], 'extra':[], -} - -_marker_values = { - 'os_name': lambda: os.name, - 'sys_platform': lambda: sys.platform, - 'python_full_version': lambda: sys.version.split()[0], - 'python_version': lambda:'%s.%s' % (sys.version_info[0], sys.version_info[1]), - 'platform_version': lambda: _platinfo('version'), - 'platform_machine': lambda: _platinfo('machine'), - 'python_implementation': lambda: _platinfo('python_implementation') or _pyimp(), -} - -def _platinfo(attr): - try: - import platform - except ImportError: - return '' - return getattr(platform, attr, lambda:'')() - -def _pyimp(): - if sys.platform=='cli': - return 'IronPython' - elif sys.platform.startswith('java'): - return 'Jython' - elif '__pypy__' in sys.builtin_module_names: - return 'PyPy' - else: - return 'CPython' - -def invalid_marker(text): - """Validate text as a PEP 426 environment marker; return exception or False""" - try: - evaluate_marker(text) - except SyntaxError: - return sys.exc_info()[1] - return False - -def evaluate_marker(text, extra=None, _ops={}): - """ - Evaluate a PEP 426 environment marker on CPython 2.4+. - Return a boolean indicating the marker result in this environment. - Raise SyntaxError if marker is invalid. - - This implementation uses the 'parser' module, which is not implemented on - Jython and has been superseded by the 'ast' module in Python 2.6 and - later. - """ - - if not _ops: - - from token import NAME, STRING - import token, symbol, operator - - def and_test(nodelist): - # MUST NOT short-circuit evaluation, or invalid syntax can be skipped! - return reduce(operator.and_, [interpret(nodelist[i]) for i in range(1,len(nodelist),2)]) - - def test(nodelist): - # MUST NOT short-circuit evaluation, or invalid syntax can be skipped! - return reduce(operator.or_, [interpret(nodelist[i]) for i in range(1,len(nodelist),2)]) - - def atom(nodelist): - t = nodelist[1][0] - if t == token.LPAR: - if nodelist[2][0] == token.RPAR: - raise SyntaxError("Empty parentheses") - return interpret(nodelist[2]) - raise SyntaxError("Language feature not supported in environment markers") - - def comparison(nodelist): - if len(nodelist)>4: - raise SyntaxError("Chained comparison not allowed in environment markers") - comp = nodelist[2][1] - cop = comp[1] - if comp[0] == NAME: - if len(nodelist[2]) == 3: - if cop == 'not': - cop = 'not in' - else: - cop = 'is not' - try: - cop = _ops[cop] - except KeyError: - raise SyntaxError(repr(cop)+" operator not allowed in environment markers") - return cop(evaluate(nodelist[1]), evaluate(nodelist[3])) - - _ops.update({ - symbol.test: test, symbol.and_test: and_test, symbol.atom: atom, - symbol.comparison: comparison, 'not in': lambda x,y: x not in y, - 'in': lambda x,y: x in y, '==': operator.eq, '!=': operator.ne, - }) - if hasattr(symbol,'or_test'): - _ops[symbol.or_test] = test - - def interpret(nodelist): - while len(nodelist)==2: nodelist = nodelist[1] - try: - op = _ops[nodelist[0]] - except KeyError: - raise SyntaxError("Comparison or logical expression expected") - raise SyntaxError("Language feature not supported in environment markers: "+symbol.sym_name[nodelist[0]]) - return op(nodelist) - - def evaluate(nodelist): - while len(nodelist)==2: nodelist = nodelist[1] - kind = nodelist[0] - name = nodelist[1] - #while len(name)==2: name = name[1] - if kind==NAME: - try: - op = _marker_values[name] - except KeyError: - raise SyntaxError("Unknown name %r" % name) - return op() - if kind==STRING: - s = nodelist[1] - if s[:1] not in "'\"" or s.startswith('"""') or s.startswith("'''") \ - or '\\' in s: - raise SyntaxError( - "Only plain strings allowed in environment markers") - return s[1:-1] - raise SyntaxError("Language feature not supported in environment markers") - - return interpret(parser.expr(text).totuple(1)[1]) - -def _markerlib_evaluate(text): - """ - Evaluate a PEP 426 environment marker using markerlib. - Return a boolean indicating the marker result in this environment. - Raise SyntaxError if marker is invalid. - """ - import _markerlib - # markerlib implements Metadata 1.2 (PEP 345) environment markers. - # Translate the variables to Metadata 2.0 (PEP 426). - env = _markerlib.default_environment() - for key in env.keys(): - new_key = key.replace('.', '_') - env[new_key] = env.pop(key) - try: - result = _markerlib.interpret(text, env) - except NameError: - e = sys.exc_info()[1] - raise SyntaxError(e.args[0]) - return result - -if 'parser' not in globals(): - # fallback to less-complete _markerlib implementation if 'parser' module - # is not available. - evaluate_marker = _markerlib_evaluate - -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 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 has_metadata(self, name): - return self.egg_info and self._has(self._fn(self.egg_info,name)) - - if sys.version_info <= (3,): - def get_metadata(self, name): - if not self.egg_info: - return "" - return self._get(self._fn(self.egg_info,name)) - else: - def get_metadata(self, name): - if not self.egg_info: - return "" - return self._get(self._fn(self.egg_info,name)).decode("utf-8") - - 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("No script named %r" % script_name) - 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): - execfile(script_filename, 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): - if resource_name: - return os.path.join(base, *resource_name.split('/')) - return base - - 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 path.lower().endswith('.egg'): - 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): - stream = open(path, 'rb') - try: - return stream.read() - finally: - stream.close() - -register_loader_type(type(None), DefaultProvider) - -if importlib_bootstrap is not None: - register_loader_type(importlib_bootstrap.SourceFileLoader, DefaultProvider) - - -class EmptyProvider(NullProvider): - """Provider that returns nothing for all requests""" - - _isdir = _has = lambda self,path: False - _get = lambda self,path: '' - _listdir = lambda self,path: [] - module_path = None - - def __init__(self): - pass - -empty_provider = EmptyProvider() - - -def build_zipmanifest(path): - """ - This builds a similar dictionary to the zipimport directory - caches. However instead of tuples, ZipInfo objects are stored. - - The translation of the tuple is as follows: - * [0] - zipinfo.filename on stock pythons this needs "/" --> os.sep - on pypy it is the same (one reason why distribute did work - in some cases on pypy and win32). - * [1] - zipinfo.compress_type - * [2] - zipinfo.compress_size - * [3] - zipinfo.file_size - * [4] - len(utf-8 encoding of filename) if zipinfo & 0x800 - len(ascii encoding of filename) otherwise - * [5] - (zipinfo.date_time[0] - 1980) << 9 | - zipinfo.date_time[1] << 5 | zipinfo.date_time[2] - * [6] - (zipinfo.date_time[3] - 1980) << 11 | - zipinfo.date_time[4] << 5 | (zipinfo.date_time[5] // 2) - * [7] - zipinfo.CRC - """ - zipinfo = dict() - zfile = zipfile.ZipFile(path) - #Got ZipFile has not __exit__ on python 3.1 - try: - for zitem in zfile.namelist(): - zpath = zitem.replace('/', os.sep) - zipinfo[zpath] = zfile.getinfo(zitem) - assert zipinfo[zpath] is not None - finally: - zfile.close() - return zipinfo - - -class ZipProvider(EggProvider): - """Resource support for zips and eggs""" - - eagers = None - - def __init__(self, module): - EggProvider.__init__(self,module) - self.zipinfo = build_zipmanifest(self.loader.archive) - 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 - 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 - fspath = self.zip_pre+zip_path # pseudo-fs 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) - ) - - 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 - date_time = zip_stat.date_time + (0, 0, -1) # ymdhms+wday, yday, dst - #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 os.path.dirname(last) # return the extracted directory name - - 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 - elif os.name=='nt': # Windows, del old file and retry - unlink(real_path) - rename(tmpnam, real_path) - return real_path - raise - - except os.error: - manager.extraction_error() # report a user-friendly 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) - f = open(file_path, 'rb') - file_contents = f.read() - f.close() - 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 has_metadata(self,name): - return name=='PKG-INFO' - - def get_metadata(self,name): - if name=='PKG-INFO': - f = open(self.path,'rU') - metadata = f.read() - f.close() - return metadata - raise KeyError("No metadata except PKG-INFO is available") - - 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.zipinfo = build_zipmanifest(importer.archive) - 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() - - -class ImpWrapper: - """PEP 302 Importer that wraps Python's "normal" import algorithm""" - - def __init__(self, path=None): - self.path = path - - def find_module(self, fullname, path=None): - subname = fullname.split(".")[-1] - if subname != fullname and self.path is None: - return None - if self.path is None: - path = None - else: - path = [self.path] - try: - file, filename, etc = imp.find_module(subname, path) - except ImportError: - return None - return ImpLoader(file, filename, etc) - - -class ImpLoader: - """PEP 302 Loader that wraps Python's "normal" import algorithm""" - - def __init__(self, file, filename, etc): - self.file = file - self.filename = filename - self.etc = etc - - def load_module(self, fullname): - try: - mod = imp.load_module(fullname, self.file, self.filename, self.etc) - finally: - if self.file: self.file.close() - # Note: we don't set __loader__ because we want the module to look - # normal; i.e. this is just a wrapper for standard import machinery - return mod - - - - -def get_importer(path_item): - """Retrieve a PEP 302 "importer" for the given path item - - If there is no importer, this returns a wrapper around the builtin import - machinery. The returned importer is only cached if it was created by a - path hook. - """ - try: - importer = sys.path_importer_cache[path_item] - except KeyError: - for hook in sys.path_hooks: - try: - importer = hook(path_item) - except ImportError: - pass - else: - break - else: - importer = None - - sys.path_importer_cache.setdefault(path_item,importer) - if importer is None: - try: - importer = ImpWrapper(path_item) - except ImportError: - pass - return importer - -try: - from pkgutil import get_importer, ImpImporter -except ImportError: - pass # Python 2.3 or 2.4, use our own implementation -else: - ImpWrapper = ImpImporter # Python 2.5, use pkgutil's implementation - del ImpLoader, ImpImporter - - - - - - -_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_in_zip(importer, path_item, only=False): - metadata = EggMetadata(importer) - if metadata.has_metadata('PKG-INFO'): - yield Distribution.from_filename(path_item, metadata=metadata) - if only: - return # don't yield nested distros - for subitem in metadata.resource_listdir('/'): - if subitem.endswith('.egg'): - subpath = os.path.join(path_item, subitem) - for dist in find_in_zip(zipimport.zipimporter(subpath), subpath): - yield dist - -register_finder(zipimport.zipimporter, find_in_zip) - -def find_nothing(importer, path_item, only=False): - return () -register_finder(object,find_nothing) - -def find_on_path(importer, path_item, only=False): - """Yield distributions accessible on a sys.path directory""" - path_item = _normalize_cached(path_item) - - if os.path.isdir(path_item) and os.access(path_item, os.R_OK): - if path_item.lower().endswith('.egg'): - # unpacked egg - yield Distribution.from_filename( - path_item, metadata=PathMetadata( - path_item, os.path.join(path_item,'EGG-INFO') - ) - ) - else: - # scan for .egg and .egg-info in directory - for entry in os.listdir(path_item): - lower = entry.lower() - if lower.endswith('.egg-info') or lower.endswith('.dist-info'): - fullpath = os.path.join(path_item, entry) - if os.path.isdir(fullpath): - # egg-info directory, allow getting metadata - metadata = PathMetadata(path_item, fullpath) - else: - metadata = FileMetadata(fullpath) - yield Distribution.from_location( - path_item,entry,metadata,precedence=DEVELOP_DIST - ) - elif not only and lower.endswith('.egg'): - for dist in find_distributions(os.path.join(path_item, entry)): - yield dist - elif not only and lower.endswith('.egg-link'): - entry_file = open(os.path.join(path_item, entry)) - try: - entry_lines = entry_file.readlines() - finally: - entry_file.close() - for line in entry_lines: - if not line.strip(): continue - for item in find_distributions(os.path.join(path_item,line.rstrip())): - yield item - break -register_finder(ImpWrapper,find_on_path) - -if importlib_bootstrap is not None: - register_finder(importlib_bootstrap.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 - loader = importer.find_module(packageName) - if loader is None: - return None - module = sys.modules.get(packageName) - if module is None: - module = sys.modules[packageName] = imp.new_module(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); module.__path__ = path - return subpath - -def declare_namespace(packageName): - """Declare that package 'packageName' is a namespace package""" - - imp.acquire_lock() - try: - if packageName in _namespace_packages: - return - - path, parent = sys.path, None - if '.' in packageName: - parent = '.'.join(packageName.split('.')[:-1]) - 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,[]).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(ImpWrapper,file_ns_handler) -register_namespace_handler(zipimport.zipimporter,file_ns_handler) - -if importlib_bootstrap is not None: - register_namespace_handler(importlib_bootstrap.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(filename)) - -def _normalize_cached(filename,_cache={}): - try: - return _cache[filename] - except KeyError: - _cache[filename] = result = normalize_path(filename) - return result - -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 ``basestring`` or sequence""" - if isinstance(strs,basestring): - for s in strs.splitlines(): - s = s.strip() - if s and not s.startswith('#'): # skip blank lines/comments - yield s - else: - for ss in strs: - for s in yield_lines(ss): - yield s - -LINE_END = re.compile(r"\s*(#.*)?$").match # whitespace and comment -CONTINUE = re.compile(r"\s*\\\s*(#.*)?$").match # line continuation -DISTRO = re.compile(r"\s*((\w|[-.])+)").match # Distribution or extra -VERSION = re.compile(r"\s*(<=?|>=?|==|!=)\s*((\w|[-.])+)").match # ver. info -COMMA = re.compile(r"\s*,").match # comma between items -OBRACKET = re.compile(r"\s*\[").match -CBRACKET = re.compile(r"\s*\]").match -MODULE = re.compile(r"\w+(\.\w+)*$").match -EGG_NAME = re.compile( - r"(?P<name>[^-]+)" - r"( -(?P<ver>[^-]+) (-py(?P<pyver>[^-]+) (-(?P<plat>.+))? )? )?", - re.VERBOSE | re.IGNORECASE -).match - -component_re = re.compile(r'(\d+ | [a-z]+ | \.| -)', re.VERBOSE) -replace = {'pre':'c', 'preview':'c','-':'final-','rc':'c','dev':'@'}.get - -def _parse_version_parts(s): - for part in component_re.split(s): - part = replace(part,part) - if not part or part=='.': - continue - if part[:1] in '0123456789': - yield part.zfill(8) # pad for numeric comparison - else: - yield '*'+part - - yield '*final' # ensure that alpha/beta/candidate are before final - -def parse_version(s): - """Convert a version string to a chronologically-sortable key - - This is a rough cross between distutils' StrictVersion and LooseVersion; - if you give it versions that would work with StrictVersion, then it behaves - the same; otherwise it acts like a slightly-smarter LooseVersion. It is - *possible* to create pathological version coding schemes that will fool - this parser, but they should be very rare in practice. - - The returned value will be a tuple of strings. Numeric portions of the - version are padded to 8 digits so they will compare numerically, but - without relying on how numbers compare relative to strings. Dots are - dropped, but dashes are retained. Trailing zeros between alpha segments - or dashes are suppressed, so that e.g. "2.4.0" is considered the same as - "2.4". Alphanumeric parts are lower-cased. - - The algorithm assumes that strings like "-" and any alpha string that - alphabetically follows "final" represents a "patch level". So, "2.4-1" - is assumed to be a branch or patch of "2.4", and therefore "2.4.1" is - considered newer than "2.4-1", which in turn is newer than "2.4". - - Strings like "a", "b", "c", "alpha", "beta", "candidate" and so on (that - come before "final" alphabetically) are assumed to be pre-release versions, - so that the version "2.4" is considered newer than "2.4a1". - - Finally, to handle miscellaneous cases, the strings "pre", "preview", and - "rc" are treated as if they were "c", i.e. as though they were release - candidates, and therefore are not as new as a version string that does not - contain them, and "dev" is replaced with an '@' so that it sorts lower than - than any other pre-release tag. - """ - parts = [] - for part in _parse_version_parts(s.lower()): - if part.startswith('*'): - if part<'*final': # remove '-' before a prerelease tag - 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) - return tuple(parts) -class EntryPoint(object): - """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 = Requirement.parse(("x[%s]" % ','.join(extras))).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, env=None, installer=None): - if require: self.require(env, installer) - entry = __import__(self.module_name, globals(),globals(), ['__name__']) - for attr in self.attrs: - try: - entry = getattr(entry,attr) - except AttributeError: - raise ImportError("%r has no %r attribute" % (entry,attr)) - return entry - - def require(self, env=None, installer=None): - if self.extras and not self.dist: - raise UnknownExtra("Can't require() without a distribution", self) - list(map(working_set.add, - working_set.resolve(self.dist.requires(self.extras),env,installer))) - - - - #@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 - """ - try: - attrs = extras = () - name,value = src.split('=',1) - if '[' in value: - value,extras = value.split('[',1) - req = Requirement.parse("x["+extras) - if req.specs: raise ValueError - extras = req.extras - if ':' in value: - value,attrs = value.split(':',1) - if not MODULE(attrs.rstrip()): - raise ValueError - attrs = attrs.rstrip().split('.') - except ValueError: - raise ValueError( - "EntryPoint must be in 'name=module:attrs [extras]' format", - src - ) - else: - return cls(name.strip(), value.strip(), attrs, extras, dist) - - parse = classmethod(parse) - - - - - - - - - #@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 - - parse_group = classmethod(parse_group) - - #@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 - - parse_map = classmethod(parse_map) - - -def _remove_md5_fragment(location): - if not location: - return '' - parsed = urlparse(location) - if parsed[-1].startswith('md5='): - return urlunparse(parsed[:-1] + ('',)) - return location - - -class Distribution(object): - """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: - # .dist-info gets much metadata differently - match = EGG_NAME(basename) - if match: - project_name, version, py_version, platform = match.group( - 'name','ver','pyver','plat' - ) - cls = _distributionImpl[ext.lower()] - return cls( - location, metadata, project_name=project_name, version=version, - py_version=py_version, platform=platform, **kw - ) - from_location = classmethod(from_location) - - - hashcmp = property( - lambda self: ( - getattr(self,'parsed_version',()), - self.precedence, - self.key, - _remove_md5_fragment(self.location), - self.py_version, - self.platform - ) - ) - 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 - key = property(key) - - #@property - def parsed_version(self): - try: - return self._parsed_version - except AttributeError: - self._parsed_version = pv = parse_version(self.version) - return pv - - parsed_version = property(parsed_version) - - #@property - def version(self): - try: - return self._version - except AttributeError: - for line in self._get_metadata(self.PKG_INFO): - if line.lower().startswith('version:'): - self._version = safe_version(line.split(':',1)[1].strip()) - return self._version - else: - raise ValueError( - "Missing 'Version:' header and/or %s file" % self.PKG_INFO, self - ) - version = property(version) - - - - - #@property - def _dep_map(self): - try: - return self.__dep_map - except AttributeError: - dm = self.__dep_map = {None: []} - for name in 'requires.txt', 'depends.txt': - for extra,reqs in split_sections(self._get_metadata(name)): - if extra: - if ':' in extra: - extra, marker = extra.split(':',1) - if invalid_marker(marker): - reqs=[] # XXX warn - elif not evaluate_marker(marker): - reqs=[] - extra = safe_extra(extra) or None - dm.setdefault(extra,[]).extend(parse_requirements(reqs)) - return dm - _dep_map = property(_dep_map) - - 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(self,name): - if self.has_metadata(name): - for line in self.get_metadata_lines(name): - yield line - - - - def activate(self,path=None): - """Ensure distribution is importable on `path` (default=sys.path)""" - if path is None: path = sys.path - self.insert_on(path) - if path is sys.path: - fixup_namespace_packages(self.location) - list(map(declare_namespace, self._get_metadata('namespace_packages.txt'))) - - - 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) - - - - - #@classmethod - def from_filename(cls,filename,metadata=None, **kw): - return cls.from_location( - _normalize_cached(filename), os.path.basename(filename), metadata, - **kw - ) - from_filename = classmethod(from_filename) - - def as_requirement(self): - """Return a ``Requirement`` that matches this distribution exactly""" - return Requirement.parse('%s==%s' % (self.project_name, self.version)) - - 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): - """Insert self.location in path before its nearest parent directory""" - - 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] - - bp = None - for p, item in enumerate(npath): - if item==nloc: - break - elif item==bdir and self.precedence==EGG_DIST: - # if it's an .egg, give it precedence over its directory - 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() - path.append(loc) - return - - # p is the spot where we found or inserted loc; now remove duplicates - while 1: - try: - np = npath.index(nloc, p+1) - except ValueError: - break - else: - del npath[np], path[np] - p = np # ha! - - return - - - def check_version_conflict(self): - if self.key=='setuptools': - return # ignore the inevitable setuptools self-conflicts :( - - 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""" - for attr in ( - 'project_name', 'version', 'py_version', 'platform', 'location', - 'precedence' - ): - 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] - extras = property(extras) - - -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: - from email.parser import Parser - self._pkg_info = Parser().parsestr(self.get_metadata(self.PKG_INFO)) - 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 _preparse_requirement(self, requires_dist): - """Convert 'Foobar (1); baz' to ('Foobar ==1', 'baz') - Split environment marker, add == prefix to version specifiers as - necessary, and remove parenthesis. - """ - parts = requires_dist.split(';', 1) + [''] - distvers = parts[0].strip() - mark = parts[1].strip() - distvers = re.sub(self.EQEQ, r"\1==\2\3", distvers) - distvers = distvers.replace('(', '').replace(')', '') - return (distvers, mark) - - def _compute_dependencies(self): - """Recompute this distribution's dependencies.""" - from _markerlib import compile as compile_marker - dm = self.__dep_map = {None: []} - - reqs = [] - # Including any condition expressions - for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: - distvers, mark = self._preparse_requirement(req) - parsed = next(parse_requirements(distvers)) - parsed.marker_fn = compile_marker(mark) - reqs.append(parsed) - - def reqs_for_extra(extra): - for req in reqs: - if req.marker_fn(override={'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 []: - extra = safe_extra(extra.strip()) - dm[extra] = list(frozenset(reqs_for_extra(extra)) - common) - - return dm - - -_distributionImpl = {'.egg': Distribution, - '.egg-info': Distribution, - '.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 - from warnings import warn - warn(stacklevel = level+1, *args, **kw) - - - - - - - - - - - - - - - - - - - - - - - -def parse_requirements(strs): - """Yield ``Requirement`` objects for each specification in `strs` - - `strs` must be an instance of ``basestring``, or a (possibly-nested) - iterable thereof. - """ - # create a steppable iterator, so we can handle \-continuations - lines = iter(yield_lines(strs)) - - def scan_list(ITEM,TERMINATOR,line,p,groups,item_name): - - items = [] - - while not TERMINATOR(line,p): - if CONTINUE(line,p): - try: - line = next(lines); p = 0 - except StopIteration: - raise ValueError( - "\\ must not appear on the last nonblank line" - ) - - match = ITEM(line,p) - if not match: - raise ValueError("Expected "+item_name+" in",line,"at",line[p:]) - - items.append(match.group(*groups)) - p = match.end() - - match = COMMA(line,p) - if match: - p = match.end() # skip the comma - elif not TERMINATOR(line,p): - raise ValueError( - "Expected ',' or end-of-list in",line,"at",line[p:] - ) - - match = TERMINATOR(line,p) - if match: p = match.end() # skip the terminator, if any - return line, p, items - - for line in lines: - match = DISTRO(line) - if not match: - raise ValueError("Missing distribution spec", line) - project_name = match.group(1) - p = match.end() - extras = [] - - match = OBRACKET(line,p) - if match: - p = match.end() - line, p, extras = scan_list( - DISTRO, CBRACKET, line, p, (1,), "'extra' name" - ) - - line, p, specs = scan_list(VERSION,LINE_END,line,p,(1,2),"version spec") - specs = [(op,safe_version(val)) for op,val in specs] - yield Requirement(project_name, specs, extras) - - -def _sort_dists(dists): - tmp = [(dist.hashcmp,dist) for dist in dists] - tmp.sort() - dists[::-1] = [d for hc,d in tmp] - - - - - - - - - - - - - - - - - -class Requirement: - def __init__(self, project_name, specs, extras): - """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" - self.unsafe_name, project_name = project_name, safe_name(project_name) - self.project_name, self.key = project_name, project_name.lower() - index = [(parse_version(v),state_machine[op],op,v) for op,v in specs] - index.sort() - self.specs = [(op,ver) for parsed,trans,op,ver in index] - self.index, self.extras = index, tuple(map(safe_extra,extras)) - self.hashCmp = ( - self.key, tuple([(op,parsed) for parsed,trans,op,ver in index]), - frozenset(self.extras) - ) - self.__hash = hash(self.hashCmp) - - def __str__(self): - specs = ','.join([''.join(s) for s in self.specs]) - extras = ','.join(self.extras) - if extras: extras = '[%s]' % extras - return '%s%s%s' % (self.project_name, extras, specs) - - def __eq__(self,other): - return isinstance(other,Requirement) and self.hashCmp==other.hashCmp - - def __contains__(self,item): - if isinstance(item,Distribution): - if item.key != self.key: return False - if self.index: item = item.parsed_version # only get if we need it - elif isinstance(item,basestring): - item = parse_version(item) - last = None - compare = lambda a, b: (a > b) - (a < b) # -1, 0, 1 - for parsed,trans,op,ver in self.index: - action = trans[compare(item,parsed)] # Indexing: 0, 1, -1 - if action=='F': return False - elif action=='T': return True - elif action=='+': last = True - elif action=='-' or last is None: last = False - if last is None: last = True # no rules encountered - return last - - - def __hash__(self): - return self.__hash - - def __repr__(self): return "Requirement.parse(%r)" % str(self) - - #@staticmethod - def parse(s): - reqs = list(parse_requirements(s)) - if reqs: - if len(reqs)==1: - return reqs[0] - raise ValueError("Expected only one requirement", s) - raise ValueError("No requirements found", s) - - parse = staticmethod(parse) - -state_machine = { - # =>< - '<' : '--T', - '<=': 'T-T', - '>' : 'F+F', - '>=': 'T+F', - '==': 'T..', - '!=': 'F++', -} - - -def _get_mro(cls): - """Get an mro for a type or classic class""" - if not isinstance(cls,type): - class cls(cls,object): pass - return cls.__mro__[1:] - return cls.__mro__ - -def _find_adapter(registry, ob): - """Return an adapter factory for `ob` from `registry`""" - for t in _get_mro(getattr(ob, '__class__', type(ob))): - if t in registry: - return registry[t] - - -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 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): - from tempfile import mkstemp - old_open = os.open - try: - os.open = os_open # temporarily bypass sandboxing - return mkstemp(*args,**kw) - finally: - os.open = old_open # and then put it back - - -# Set up global resource manager (deliberately not state-saved) -_manager = ResourceManager() -def _initialize(g): - for name in dir(_manager): - if not name.startswith('_'): - g[name] = getattr(_manager, name) -_initialize(globals()) - -# Prepare the master working set and make the ``require()`` API available -_declare_state('object', working_set = WorkingSet()) -try: - # Does the main program list any requirements? - from __main__ import __requires__ -except ImportError: - pass # No: just use the default working set based on sys.path -else: - # Yes: ensure the requirements are met, by prefixing sys.path if necessary - try: - working_set.require(__requires__) - except VersionConflict: # try it without defaults already on sys.path - working_set = WorkingSet([]) # by starting with an empty path - for dist in working_set.resolve( - parse_requirements(__requires__), Environment() - ): - working_set.add(dist) - for entry in sys.path: # add any missing entries from sys.path - if entry not in working_set.entries: - working_set.add_entry(entry) - sys.path[:] = working_set.entries # then copy back to sys.path - -require = working_set.require -iter_entry_points = working_set.iter_entry_points -add_activation_listener = working_set.subscribe -run_script = working_set.run_script -run_main = run_script # backward compatibility -# Activate all distributions already on sys.path, and ensure that -# all distributions added to the working set in the future (e.g. by -# calling ``require()``) will get activated as well. -add_activation_listener(lambda dist: dist.activate()) -working_set.entries=[]; list(map(working_set.add_entry,sys.path)) # match order - diff --git a/PythonEnv/2.7/Lib/site-packages/pkg_resources.pyc b/PythonEnv/2.7/Lib/site-packages/pkg_resources.pyc deleted file mode 100644 index 6111bf85a512bb1891f0a689d713a01f1d9c11b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118433 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 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/PKG-INFO b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/PKG-INFO deleted file mode 100644 index 5cc6f0b29..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/PKG-INFO +++ /dev/null @@ -1,960 +0,0 @@ -Metadata-Version: 1.1 -Name: setuptools -Version: 0.9.8 -Summary: Easily download, build, install, upgrade, and uninstall Python packages -Home-page: https://pypi.python.org/pypi/setuptools -Author: Python Packaging Authority -Author-email: distutils-sig@python.org -License: PSF or ZPL -Description: =============================== - Installing and Using Setuptools - =============================== - - .. contents:: **Table of Contents** - - - ------------------------- - Installation Instructions - ------------------------- - - Upgrading from Distribute - ========================= - - Currently, Distribute disallows installing Setuptools 0.7+ over Distribute. - You must first uninstall any active version of Distribute first (see - `Uninstalling`_). - - Upgrading from Setuptools 0.6 - ============================= - - Upgrading from prior versions of Setuptools is supported. Initial reports - good success in this regard. - - Windows - ======= - - The recommended way to install setuptools on Windows is to download - `ez_setup.py`_ and run it. The script will download the appropriate .egg - file and install it for you. - - .. _ez_setup.py: https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py - - For best results, uninstall previous versions FIRST (see `Uninstalling`_). - - Once installation is complete, you will find an ``easy_install.exe`` program in - your Python ``Scripts`` subdirectory. For simple invocation and best results, - add this directory to your ``PATH`` environment variable, if it is not already - present. - - - Unix-based Systems including Mac OS X - ===================================== - - Download `ez_setup.py`_ and run it using the target Python version. The script - will download the appropriate version and install it for you:: - - > wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | python - - Note that you will may need to invoke the command with superuser privileges to - install to the system Python. - - Alternatively, on Python 2.6 and later, Setuptools may be installed to a - user-local path:: - - > wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py - > python ez_setup.py --user - - - Advanced Installation - ===================== - - For more advanced installation options, such as installing to custom - locations or prefixes, download and extract the source - tarball from `Setuptools on PyPI <https://pypi.python.org/pypi/setuptools>`_ - and run setup.py with any supported distutils and Setuptools options. - For example:: - - setuptools-x.x$ python setup.py --prefix=/opt/setuptools - - Use ``--help`` to get a full options list, but we recommend consulting - the `EasyInstall manual`_ for detailed instructions, especially `the section - on custom installation locations`_. - - .. _EasyInstall manual: https://pythonhosted.org/setuptools/EasyInstall - .. _the section on custom installation locations: https://pythonhosted.org/setuptools/EasyInstall#custom-installation-locations - - - Downloads - ========= - - All setuptools downloads can be found at `the project's home page in the Python - Package Index`_. Scroll to the very bottom of the page to find the links. - - .. _the project's home page in the Python Package Index: https://pypi.python.org/pypi/setuptools - - In addition to the PyPI downloads, the development version of ``setuptools`` - is available from the `Bitbucket repo`_, and in-development versions of the - `0.6 branch`_ are available as well. - - .. _Bitbucket repo: https://bitbucket.org/pypa/setuptools/get/default.tar.gz#egg=setuptools-dev - .. _0.6 branch: http://svn.python.org/projects/sandbox/branches/setuptools-0.6/#egg=setuptools-dev06 - - Uninstalling - ============ - - On Windows, if Setuptools was installed using an ``.exe`` or ``.msi`` - installer, simply use the uninstall feature of "Add/Remove Programs" in the - Control Panel. - - Otherwise, to uninstall Setuptools or Distribute, regardless of the Python - version, delete all ``setuptools*`` and ``distribute*`` files and - directories from your system's ``site-packages`` directory - (and any other ``sys.path`` directories) FIRST. - - If you are upgrading or otherwise plan to re-install Setuptools or Distribute, - nothing further needs to be done. If you want to completely remove Setuptools, - you may also want to remove the 'easy_install' and 'easy_install-x.x' scripts - and associated executables installed to the Python scripts directory. - - -------------------------------- - Using Setuptools and EasyInstall - -------------------------------- - - Here are some of the available manuals, tutorials, and other resources for - learning about Setuptools, Python Eggs, and EasyInstall: - - * `The EasyInstall user's guide and reference manual`_ - * `The setuptools Developer's Guide`_ - * `The pkg_resources API reference`_ - * `Package Compatibility Notes`_ (user-maintained) - * `The Internal Structure of Python Eggs`_ - - Questions, comments, and bug reports should be directed to the `distutils-sig - mailing list`_. If you have written (or know of) any tutorials, documentation, - plug-ins, or other resources for setuptools users, please let us know about - them there, so this reference list can be updated. If you have working, - *tested* patches to correct problems or add features, you may submit them to - the `setuptools bug tracker`_. - - .. _setuptools bug tracker: https://bitbucket.org/pypa/setuptools/issues - .. _Package Compatibility Notes: https://pythonhosted.org/setuptools/PackageNotes - .. _The Internal Structure of Python Eggs: https://pythonhosted.org/setuptools/formats.html - .. _The setuptools Developer's Guide: https://pythonhosted.org/setuptools/setuptools.html - .. _The pkg_resources API reference: https://pythonhosted.org/setuptools/pkg_resources.html - .. _The EasyInstall user's guide and reference manual: https://pythonhosted.org/setuptools/easy_install.html - .. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/ - - - ------- - Credits - ------- - - * The original design for the ``.egg`` format and the ``pkg_resources`` API was - co-created by Phillip Eby and Bob Ippolito. Bob also implemented the first - version of ``pkg_resources``, and supplied the OS X operating system version - compatibility algorithm. - - * Ian Bicking implemented many early "creature comfort" features of - easy_install, including support for downloading via Sourceforge and - Subversion repositories. Ian's comments on the Web-SIG about WSGI - application deployment also inspired the concept of "entry points" in eggs, - and he has given talks at PyCon and elsewhere to inform and educate the - community about eggs and setuptools. - - * Jim Fulton contributed time and effort to build automated tests of various - aspects of ``easy_install``, and supplied the doctests for the command-line - ``.exe`` wrappers on Windows. - - * Phillip J. Eby is the seminal author of setuptools, and - first proposed the idea of an importable binary distribution format for - Python application plug-ins. - - * Significant parts of the implementation of setuptools were funded by the Open - Source Applications Foundation, to provide a plug-in infrastructure for the - Chandler PIM application. In addition, many OSAF staffers (such as Mike - "Code Bear" Taylor) contributed their time and stress as guinea pigs for the - use of eggs and setuptools, even before eggs were "cool". (Thanks, guys!) - - * Since the merge with Distribute, Jason R. Coombs is the - maintainer of setuptools. The project is maintained in coordination with - the Python Packaging Authority (PyPA) and the larger Python community. - - .. _files: - - ======= - CHANGES - ======= - - ----- - 0.9.8 - ----- - - * `Issue #53 <https://bitbucket.org/pypa/setuptools/issue/53>`_: Fix NameErrors in `_vcs_split_rev_from_url`. - - ----- - 0.9.7 - ----- - - * `Issue #49 <https://bitbucket.org/pypa/setuptools/issue/49>`_: Correct AttributeError on PyPy where a hashlib.HASH object does - not have a `.name` attribute. - * `Issue #34 <https://bitbucket.org/pypa/setuptools/issue/34>`_: Documentation now refers to bootstrap script in code repository - referenced by bookmark. - * Add underscore-separated keys to environment markers (markerlib). - - ----- - 0.9.6 - ----- - - * `Issue #44 <https://bitbucket.org/pypa/setuptools/issue/44>`_: Test failure on Python 2.4 when MD5 hash doesn't have a `.name` - attribute. - - ----- - 0.9.5 - ----- - - * `Python #17980 <http://bugs.python.org/issue17980>`_: Fix security vulnerability in SSL certificate validation. - - ----- - 0.9.4 - ----- - - * `Issue #43 <https://bitbucket.org/pypa/setuptools/issue/43>`_: Fix issue (introduced in 0.9.1) with version resolution when - upgrading over other releases of Setuptools. - - ----- - 0.9.3 - ----- - - * `Issue #42 <https://bitbucket.org/pypa/setuptools/issue/42>`_: Fix new ``AttributeError`` introduced in last fix. - - ----- - 0.9.2 - ----- - - * `Issue #42 <https://bitbucket.org/pypa/setuptools/issue/42>`_: Fix regression where blank checksums would trigger an - ``AttributeError``. - - ----- - 0.9.1 - ----- - - * `Distribute #386 <https://bitbucket.org/tarek/distribute/issue/386>`_: Allow other positional and keyword arguments to os.open. - * Corrected dependency on certifi mis-referenced in 0.9. - - --- - 0.9 - --- - - * `package_index` now validates hashes other than MD5 in download links. - - --- - 0.8 - --- - - * Code base now runs on Python 2.4 - Python 3.3 without Python 2to3 - conversion. - - ----- - 0.7.8 - ----- - - * `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Yet another fix for yet another regression. - - ----- - 0.7.7 - ----- - - * `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Repair AttributeError created in last release (redo). - * `Issue #30 <https://bitbucket.org/pypa/setuptools/issue/30>`_: Added test for get_cache_path. - - ----- - 0.7.6 - ----- - - * `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Repair AttributeError created in last release. - - ----- - 0.7.5 - ----- - - * `Issue #21 <https://bitbucket.org/pypa/setuptools/issue/21>`_: Restore Python 2.4 compatibility in ``test_easy_install``. - * `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Merged additional warning from Distribute 0.6.46. - * Now honor the environment variable - ``SETUPTOOLS_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT`` in addition to the now - deprecated ``DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT``. - - ----- - 0.7.4 - ----- - - * `Issue #20 <https://bitbucket.org/pypa/setuptools/issue/20>`_: Fix comparison of parsed SVN version on Python 3. - - ----- - 0.7.3 - ----- - - * `Issue #1 <https://bitbucket.org/pypa/setuptools/issue/1>`_: Disable installation of Windows-specific files on non-Windows systems. - * Use new sysconfig module with Python 2.7 or >=3.2. - - ----- - 0.7.2 - ----- - - * `Issue #14 <https://bitbucket.org/pypa/setuptools/issue/14>`_: Use markerlib when the `parser` module is not available. - * `Issue #10 <https://bitbucket.org/pypa/setuptools/issue/10>`_: ``ez_setup.py`` now uses HTTPS to download setuptools from PyPI. - - ----- - 0.7.1 - ----- - - * Fix NameError (`Issue #3 <https://bitbucket.org/pypa/setuptools/issue/3>`_) again - broken in bad merge. - - --- - 0.7 - --- - - * Merged Setuptools and Distribute. See docs/merge.txt for details. - - Added several features that were slated for setuptools 0.6c12: - - * Index URL now defaults to HTTPS. - * Added experimental environment marker support. Now clients may designate a - PEP-426 environment marker for "extra" dependencies. Setuptools uses this - feature in ``setup.py`` for optional SSL and certificate validation support - on older platforms. Based on Distutils-SIG discussions, the syntax is - somewhat tentative. There should probably be a PEP with a firmer spec before - the feature should be considered suitable for use. - * Added support for SSL certificate validation when installing packages from - an HTTPS service. - - ----- - 0.7b4 - ----- - - * `Issue #3 <https://bitbucket.org/pypa/setuptools/issue/3>`_: Fixed NameError in SSL support. - - ------ - 0.6.49 - ------ - - * Move warning check in ``get_cache_path`` to follow the directory creation - to avoid errors when the cache path does not yet exist. Fixes the error - reported in `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_. - - ------ - 0.6.48 - ------ - - * Correct AttributeError in ``ResourceManager.get_cache_path`` introduced in - 0.6.46 (redo). - - ------ - 0.6.47 - ------ - - * Correct AttributeError in ``ResourceManager.get_cache_path`` introduced in - 0.6.46. - - ------ - 0.6.46 - ------ - - * `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Issue a warning if the PYTHON_EGG_CACHE or otherwise - customized egg cache location specifies a directory that's group- or - world-writable. - - ------ - 0.6.45 - ------ - - * `Distribute #379 <https://bitbucket.org/tarek/distribute/issue/379>`_: ``distribute_setup.py`` now traps VersionConflict as well, - restoring ability to upgrade from an older setuptools version. - - ------ - 0.6.44 - ------ - - * ``distribute_setup.py`` has been updated to allow Setuptools 0.7 to - satisfy use_setuptools. - - ------ - 0.6.43 - ------ - - * `Distribute #378 <https://bitbucket.org/tarek/distribute/issue/378>`_: Restore support for Python 2.4 Syntax (regression in 0.6.42). - - ------ - 0.6.42 - ------ - - * External links finder no longer yields duplicate links. - * `Distribute #337 <https://bitbucket.org/tarek/distribute/issue/337>`_: Moved site.py to setuptools/site-patch.py (graft of very old - patch from setuptools trunk which inspired PR `#31 <https://bitbucket.org/pypa/setuptools/issue/31>`_). - - ------ - 0.6.41 - ------ - - * `Distribute #27 <https://bitbucket.org/tarek/distribute/issue/27>`_: Use public api for loading resources from zip files rather than - the private method `_zip_directory_cache`. - * Added a new function ``easy_install.get_win_launcher`` which may be used by - third-party libraries such as buildout to get a suitable script launcher. - - ------ - 0.6.40 - ------ - - * `Distribute #376 <https://bitbucket.org/tarek/distribute/issue/376>`_: brought back cli.exe and gui.exe that were deleted in the - previous release. - - ------ - 0.6.39 - ------ - - * Add support for console launchers on ARM platforms. - * Fix possible issue in GUI launchers where the subsystem was not supplied to - the linker. - * Launcher build script now refactored for robustness. - * `Distribute #375 <https://bitbucket.org/tarek/distribute/issue/375>`_: Resources extracted from a zip egg to the file system now also - check the contents of the file against the zip contents during each - invocation of get_resource_filename. - - ------ - 0.6.38 - ------ - - * `Distribute #371 <https://bitbucket.org/tarek/distribute/issue/371>`_: The launcher manifest file is now installed properly. - - ------ - 0.6.37 - ------ - - * `Distribute #143 <https://bitbucket.org/tarek/distribute/issue/143>`_: Launcher scripts, including easy_install itself, are now - accompanied by a manifest on 32-bit Windows environments to avoid the - Installer Detection Technology and thus undesirable UAC elevation described - in `this Microsoft article - <http://technet.microsoft.com/en-us/library/cc709628%28WS.10%29.aspx>`_. - - ------ - 0.6.36 - ------ - - * Pull Request `#35 <https://bitbucket.org/pypa/setuptools/issue/35>`_: In `Buildout #64 <https://github.com/buildout/buildout/issues/64>`_, it was reported that - under Python 3, installation of distutils scripts could attempt to copy - the ``__pycache__`` directory as a file, causing an error, apparently only - under Windows. Easy_install now skips all directories when processing - metadata scripts. - - ------ - 0.6.35 - ------ - - - Note this release is backward-incompatible with distribute 0.6.23-0.6.34 in - how it parses version numbers. - - * `Distribute #278 <https://bitbucket.org/tarek/distribute/issue/278>`_: Restored compatibility with distribute 0.6.22 and setuptools - 0.6. Updated the documentation to match more closely with the version - parsing as intended in setuptools 0.6. - - ------ - 0.6.34 - ------ - - * `Distribute #341 <https://bitbucket.org/tarek/distribute/issue/341>`_: 0.6.33 fails to build under Python 2.4. - - ------ - 0.6.33 - ------ - - * Fix 2 errors with Jython 2.5. - * Fix 1 failure with Jython 2.5 and 2.7. - * Disable workaround for Jython scripts on Linux systems. - * `Distribute #336 <https://bitbucket.org/tarek/distribute/issue/336>`_: `setup.py` no longer masks failure exit code when tests fail. - * Fix issue in pkg_resources where try/except around a platform-dependent - import would trigger hook load failures on Mercurial. See pull request 32 - for details. - * `Distribute #341 <https://bitbucket.org/tarek/distribute/issue/341>`_: Fix a ResourceWarning. - - ------ - 0.6.32 - ------ - - * Fix test suite with Python 2.6. - * Fix some DeprecationWarnings and ResourceWarnings. - * `Distribute #335 <https://bitbucket.org/tarek/distribute/issue/335>`_: Backed out `setup_requires` superceding installed requirements - until regression can be addressed. - - ------ - 0.6.31 - ------ - - * `Distribute #303 <https://bitbucket.org/tarek/distribute/issue/303>`_: Make sure the manifest only ever contains UTF-8 in Python 3. - * `Distribute #329 <https://bitbucket.org/tarek/distribute/issue/329>`_: Properly close files created by tests for compatibility with - Jython. - * Work around `Jython #1980 <http://bugs.jython.org/issue1980>`_ and `Jython #1981 <http://bugs.jython.org/issue1981>`_. - * `Distribute #334 <https://bitbucket.org/tarek/distribute/issue/334>`_: Provide workaround for packages that reference `sys.__stdout__` - such as numpy does. This change should address - `virtualenv `#359 <https://bitbucket.org/pypa/setuptools/issue/359>`_ <https://github.com/pypa/virtualenv/issues/359>`_ as long - as the system encoding is UTF-8 or the IO encoding is specified in the - environment, i.e.:: - - PYTHONIOENCODING=utf8 pip install numpy - - * Fix for encoding issue when installing from Windows executable on Python 3. - * `Distribute #323 <https://bitbucket.org/tarek/distribute/issue/323>`_: Allow `setup_requires` requirements to supercede installed - requirements. Added some new keyword arguments to existing pkg_resources - methods. Also had to updated how __path__ is handled for namespace packages - to ensure that when a new egg distribution containing a namespace package is - placed on sys.path, the entries in __path__ are found in the same order they - would have been in had that egg been on the path when pkg_resources was - first imported. - - ------ - 0.6.30 - ------ - - * `Distribute #328 <https://bitbucket.org/tarek/distribute/issue/328>`_: Clean up temporary directories in distribute_setup.py. - * Fix fatal bug in distribute_setup.py. - - ------ - 0.6.29 - ------ - - * Pull Request `#14 <https://bitbucket.org/pypa/setuptools/issue/14>`_: Honor file permissions in zip files. - * `Distribute #327 <https://bitbucket.org/tarek/distribute/issue/327>`_: Merged pull request `#24 <https://bitbucket.org/pypa/setuptools/issue/24>`_ to fix a dependency problem with pip. - * Merged pull request `#23 <https://bitbucket.org/pypa/setuptools/issue/23>`_ to fix https://github.com/pypa/virtualenv/issues/301. - * If Sphinx is installed, the `upload_docs` command now runs `build_sphinx` - to produce uploadable documentation. - * `Distribute #326 <https://bitbucket.org/tarek/distribute/issue/326>`_: `upload_docs` provided mangled auth credentials under Python 3. - * `Distribute #320 <https://bitbucket.org/tarek/distribute/issue/320>`_: Fix check for "createable" in distribute_setup.py. - * `Distribute #305 <https://bitbucket.org/tarek/distribute/issue/305>`_: Remove a warning that was triggered during normal operations. - * `Distribute #311 <https://bitbucket.org/tarek/distribute/issue/311>`_: Print metadata in UTF-8 independent of platform. - * `Distribute #303 <https://bitbucket.org/tarek/distribute/issue/303>`_: Read manifest file with UTF-8 encoding under Python 3. - * `Distribute #301 <https://bitbucket.org/tarek/distribute/issue/301>`_: Allow to run tests of namespace packages when using 2to3. - * `Distribute #304 <https://bitbucket.org/tarek/distribute/issue/304>`_: Prevent import loop in site.py under Python 3.3. - * `Distribute #283 <https://bitbucket.org/tarek/distribute/issue/283>`_: Reenable scanning of `*.pyc` / `*.pyo` files on Python 3.3. - * `Distribute #299 <https://bitbucket.org/tarek/distribute/issue/299>`_: The develop command didn't work on Python 3, when using 2to3, - as the egg link would go to the Python 2 source. Linking to the 2to3'd code - in build/lib makes it work, although you will have to rebuild the module - before testing it. - * `Distribute #306 <https://bitbucket.org/tarek/distribute/issue/306>`_: Even if 2to3 is used, we build in-place under Python 2. - * `Distribute #307 <https://bitbucket.org/tarek/distribute/issue/307>`_: Prints the full path when .svn/entries is broken. - * `Distribute #313 <https://bitbucket.org/tarek/distribute/issue/313>`_: Support for sdist subcommands (Python 2.7) - * `Distribute #314 <https://bitbucket.org/tarek/distribute/issue/314>`_: test_local_index() would fail an OS X. - * `Distribute #310 <https://bitbucket.org/tarek/distribute/issue/310>`_: Non-ascii characters in a namespace __init__.py causes errors. - * `Distribute #218 <https://bitbucket.org/tarek/distribute/issue/218>`_: Improved documentation on behavior of `package_data` and - `include_package_data`. Files indicated by `package_data` are now included - in the manifest. - * `distribute_setup.py` now allows a `--download-base` argument for retrieving - distribute from a specified location. - - ------ - 0.6.28 - ------ - - * `Distribute #294 <https://bitbucket.org/tarek/distribute/issue/294>`_: setup.py can now be invoked from any directory. - * Scripts are now installed honoring the umask. - * Added support for .dist-info directories. - * `Distribute #283 <https://bitbucket.org/tarek/distribute/issue/283>`_: Fix and disable scanning of `*.pyc` / `*.pyo` files on - Python 3.3. - - ------ - 0.6.27 - ------ - - * Support current snapshots of CPython 3.3. - * Distribute now recognizes README.rst as a standard, default readme file. - * Exclude 'encodings' modules when removing modules from sys.modules. - Workaround for `#285 <https://bitbucket.org/pypa/setuptools/issue/285>`_. - * `Distribute #231 <https://bitbucket.org/tarek/distribute/issue/231>`_: Don't fiddle with system python when used with buildout - (bootstrap.py) - - ------ - 0.6.26 - ------ - - * `Distribute #183 <https://bitbucket.org/tarek/distribute/issue/183>`_: Symlinked files are now extracted from source distributions. - * `Distribute #227 <https://bitbucket.org/tarek/distribute/issue/227>`_: Easy_install fetch parameters are now passed during the - installation of a source distribution; now fulfillment of setup_requires - dependencies will honor the parameters passed to easy_install. - - ------ - 0.6.25 - ------ - - * `Distribute #258 <https://bitbucket.org/tarek/distribute/issue/258>`_: Workaround a cache issue - * `Distribute #260 <https://bitbucket.org/tarek/distribute/issue/260>`_: distribute_setup.py now accepts the --user parameter for - Python 2.6 and later. - * `Distribute #262 <https://bitbucket.org/tarek/distribute/issue/262>`_: package_index.open_with_auth no longer throws LookupError - on Python 3. - * `Distribute #269 <https://bitbucket.org/tarek/distribute/issue/269>`_: AttributeError when an exception occurs reading Manifest.in - on late releases of Python. - * `Distribute #272 <https://bitbucket.org/tarek/distribute/issue/272>`_: Prevent TypeError when namespace package names are unicode - and single-install-externally-managed is used. Also fixes PIP issue - 449. - * `Distribute #273 <https://bitbucket.org/tarek/distribute/issue/273>`_: Legacy script launchers now install with Python2/3 support. - - ------ - 0.6.24 - ------ - - * `Distribute #249 <https://bitbucket.org/tarek/distribute/issue/249>`_: Added options to exclude 2to3 fixers - - ------ - 0.6.23 - ------ - - * `Distribute #244 <https://bitbucket.org/tarek/distribute/issue/244>`_: Fixed a test - * `Distribute #243 <https://bitbucket.org/tarek/distribute/issue/243>`_: Fixed a test - * `Distribute #239 <https://bitbucket.org/tarek/distribute/issue/239>`_: Fixed a test - * `Distribute #240 <https://bitbucket.org/tarek/distribute/issue/240>`_: Fixed a test - * `Distribute #241 <https://bitbucket.org/tarek/distribute/issue/241>`_: Fixed a test - * `Distribute #237 <https://bitbucket.org/tarek/distribute/issue/237>`_: Fixed a test - * `Distribute #238 <https://bitbucket.org/tarek/distribute/issue/238>`_: easy_install now uses 64bit executable wrappers on 64bit Python - * `Distribute #208 <https://bitbucket.org/tarek/distribute/issue/208>`_: Fixed parsed_versions, it now honors post-releases as noted in the documentation - * `Distribute #207 <https://bitbucket.org/tarek/distribute/issue/207>`_: Windows cli and gui wrappers pass CTRL-C to child python process - * `Distribute #227 <https://bitbucket.org/tarek/distribute/issue/227>`_: easy_install now passes its arguments to setup.py bdist_egg - * `Distribute #225 <https://bitbucket.org/tarek/distribute/issue/225>`_: Fixed a NameError on Python 2.5, 2.4 - - ------ - 0.6.21 - ------ - - * `Distribute #225 <https://bitbucket.org/tarek/distribute/issue/225>`_: FIxed a regression on py2.4 - - ------ - 0.6.20 - ------ - - * `Distribute #135 <https://bitbucket.org/tarek/distribute/issue/135>`_: Include url in warning when processing URLs in package_index. - * `Distribute #212 <https://bitbucket.org/tarek/distribute/issue/212>`_: Fix issue where easy_instal fails on Python 3 on windows installer. - * `Distribute #213 <https://bitbucket.org/tarek/distribute/issue/213>`_: Fix typo in documentation. - - ------ - 0.6.19 - ------ - - * `Distribute #206 <https://bitbucket.org/tarek/distribute/issue/206>`_: AttributeError: 'HTTPMessage' object has no attribute 'getheaders' - - ------ - 0.6.18 - ------ - - * `Distribute #210 <https://bitbucket.org/tarek/distribute/issue/210>`_: Fixed a regression introduced by `Distribute #204 <https://bitbucket.org/tarek/distribute/issue/204>`_ fix. - - ------ - 0.6.17 - ------ - - * Support 'DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT' environment - variable to allow to disable installation of easy_install-${version} script. - * Support Python >=3.1.4 and >=3.2.1. - * `Distribute #204 <https://bitbucket.org/tarek/distribute/issue/204>`_: Don't try to import the parent of a namespace package in - declare_namespace - * `Distribute #196 <https://bitbucket.org/tarek/distribute/issue/196>`_: Tolerate responses with multiple Content-Length headers - * `Distribute #205 <https://bitbucket.org/tarek/distribute/issue/205>`_: Sandboxing doesn't preserve working_set. Leads to setup_requires - problems. - - ------ - 0.6.16 - ------ - - * Builds sdist gztar even on Windows (avoiding `Distribute #193 <https://bitbucket.org/tarek/distribute/issue/193>`_). - * `Distribute #192 <https://bitbucket.org/tarek/distribute/issue/192>`_: Fixed metadata omitted on Windows when package_dir - specified with forward-slash. - * `Distribute #195 <https://bitbucket.org/tarek/distribute/issue/195>`_: Cython build support. - * `Distribute #200 <https://bitbucket.org/tarek/distribute/issue/200>`_: Issues with recognizing 64-bit packages on Windows. - - ------ - 0.6.15 - ------ - - * Fixed typo in bdist_egg - * Several issues under Python 3 has been solved. - * `Distribute #146 <https://bitbucket.org/tarek/distribute/issue/146>`_: Fixed missing DLL files after easy_install of windows exe package. - - ------ - 0.6.14 - ------ - - * `Distribute #170 <https://bitbucket.org/tarek/distribute/issue/170>`_: Fixed unittest failure. Thanks to Toshio. - * `Distribute #171 <https://bitbucket.org/tarek/distribute/issue/171>`_: Fixed race condition in unittests cause deadlocks in test suite. - * `Distribute #143 <https://bitbucket.org/tarek/distribute/issue/143>`_: Fixed a lookup issue with easy_install. - Thanks to David and Zooko. - * `Distribute #174 <https://bitbucket.org/tarek/distribute/issue/174>`_: Fixed the edit mode when its used with setuptools itself - - ------ - 0.6.13 - ------ - - * `Distribute #160 <https://bitbucket.org/tarek/distribute/issue/160>`_: 2.7 gives ValueError("Invalid IPv6 URL") - * `Distribute #150 <https://bitbucket.org/tarek/distribute/issue/150>`_: Fixed using ~/.local even in a --no-site-packages virtualenv - * `Distribute #163 <https://bitbucket.org/tarek/distribute/issue/163>`_: scan index links before external links, and don't use the md5 when - comparing two distributions - - ------ - 0.6.12 - ------ - - * `Distribute #149 <https://bitbucket.org/tarek/distribute/issue/149>`_: Fixed various failures on 2.3/2.4 - - ------ - 0.6.11 - ------ - - * Found another case of SandboxViolation - fixed - * `Distribute #15 <https://bitbucket.org/tarek/distribute/issue/15>`_ and `Distribute #48 <https://bitbucket.org/tarek/distribute/issue/48>`_: Introduced a socket timeout of 15 seconds on url openings - * Added indexsidebar.html into MANIFEST.in - * `Distribute #108 <https://bitbucket.org/tarek/distribute/issue/108>`_: Fixed TypeError with Python3.1 - * `Distribute #121 <https://bitbucket.org/tarek/distribute/issue/121>`_: Fixed --help install command trying to actually install. - * `Distribute #112 <https://bitbucket.org/tarek/distribute/issue/112>`_: Added an os.makedirs so that Tarek's solution will work. - * `Distribute #133 <https://bitbucket.org/tarek/distribute/issue/133>`_: Added --no-find-links to easy_install - * Added easy_install --user - * `Distribute #100 <https://bitbucket.org/tarek/distribute/issue/100>`_: Fixed develop --user not taking '.' in PYTHONPATH into account - * `Distribute #134 <https://bitbucket.org/tarek/distribute/issue/134>`_: removed spurious UserWarnings. Patch by VanLindberg - * `Distribute #138 <https://bitbucket.org/tarek/distribute/issue/138>`_: cant_write_to_target error when setup_requires is used. - * `Distribute #147 <https://bitbucket.org/tarek/distribute/issue/147>`_: respect the sys.dont_write_bytecode flag - - ------ - 0.6.10 - ------ - - * Reverted change made for the DistributionNotFound exception because - zc.buildout uses the exception message to get the name of the - distribution. - - ----- - 0.6.9 - ----- - - * `Distribute #90 <https://bitbucket.org/tarek/distribute/issue/90>`_: unknown setuptools version can be added in the working set - * `Distribute #87 <https://bitbucket.org/tarek/distribute/issue/87>`_: setupt.py doesn't try to convert distribute_setup.py anymore - Initial Patch by arfrever. - * `Distribute #89 <https://bitbucket.org/tarek/distribute/issue/89>`_: added a side bar with a download link to the doc. - * `Distribute #86 <https://bitbucket.org/tarek/distribute/issue/86>`_: fixed missing sentence in pkg_resources doc. - * Added a nicer error message when a DistributionNotFound is raised. - * `Distribute #80 <https://bitbucket.org/tarek/distribute/issue/80>`_: test_develop now works with Python 3.1 - * `Distribute #93 <https://bitbucket.org/tarek/distribute/issue/93>`_: upload_docs now works if there is an empty sub-directory. - * `Distribute #70 <https://bitbucket.org/tarek/distribute/issue/70>`_: exec bit on non-exec files - * `Distribute #99 <https://bitbucket.org/tarek/distribute/issue/99>`_: now the standalone easy_install command doesn't uses a - "setup.cfg" if any exists in the working directory. It will use it - only if triggered by ``install_requires`` from a setup.py call - (install, develop, etc). - * `Distribute #101 <https://bitbucket.org/tarek/distribute/issue/101>`_: Allowing ``os.devnull`` in Sandbox - * `Distribute #92 <https://bitbucket.org/tarek/distribute/issue/92>`_: Fixed the "no eggs" found error with MacPort - (platform.mac_ver() fails) - * `Distribute #103 <https://bitbucket.org/tarek/distribute/issue/103>`_: test_get_script_header_jython_workaround not run - anymore under py3 with C or POSIX local. Contributed by Arfrever. - * `Distribute #104 <https://bitbucket.org/tarek/distribute/issue/104>`_: remvoved the assertion when the installation fails, - with a nicer message for the end user. - * `Distribute #100 <https://bitbucket.org/tarek/distribute/issue/100>`_: making sure there's no SandboxViolation when - the setup script patches setuptools. - - ----- - 0.6.8 - ----- - - * Added "check_packages" in dist. (added in Setuptools 0.6c11) - * Fixed the DONT_PATCH_SETUPTOOLS state. - - ----- - 0.6.7 - ----- - - * `Distribute #58 <https://bitbucket.org/tarek/distribute/issue/58>`_: Added --user support to the develop command - * `Distribute #11 <https://bitbucket.org/tarek/distribute/issue/11>`_: Generated scripts now wrap their call to the script entry point - in the standard "if name == 'main'" - * Added the 'DONT_PATCH_SETUPTOOLS' environment variable, so virtualenv - can drive an installation that doesn't patch a global setuptools. - * Reviewed unladen-swallow specific change from - http://code.google.com/p/unladen-swallow/source/detail?spec=svn875&r=719 - and determined that it no longer applies. Distribute should work fine with - Unladen Swallow 2009Q3. - * `Distribute #21 <https://bitbucket.org/tarek/distribute/issue/21>`_: Allow PackageIndex.open_url to gracefully handle all cases of a - httplib.HTTPException instead of just InvalidURL and BadStatusLine. - * Removed virtual-python.py from this distribution and updated documentation - to point to the actively maintained virtualenv instead. - * `Distribute #64 <https://bitbucket.org/tarek/distribute/issue/64>`_: use_setuptools no longer rebuilds the distribute egg every - time it is run - * use_setuptools now properly respects the requested version - * use_setuptools will no longer try to import a distribute egg for the - wrong Python version - * `Distribute #74 <https://bitbucket.org/tarek/distribute/issue/74>`_: no_fake should be True by default. - * `Distribute #72 <https://bitbucket.org/tarek/distribute/issue/72>`_: avoid a bootstrapping issue with easy_install -U - - ----- - 0.6.6 - ----- - - * Unified the bootstrap file so it works on both py2.x and py3k without 2to3 - (patch by Holger Krekel) - - ----- - 0.6.5 - ----- - - * `Distribute #65 <https://bitbucket.org/tarek/distribute/issue/65>`_: cli.exe and gui.exe are now generated at build time, - depending on the platform in use. - - * `Distribute #67 <https://bitbucket.org/tarek/distribute/issue/67>`_: Fixed doc typo (PEP 381/382) - - * Distribute no longer shadows setuptools if we require a 0.7-series - setuptools. And an error is raised when installing a 0.7 setuptools with - distribute. - - * When run from within buildout, no attempt is made to modify an existing - setuptools egg, whether in a shared egg directory or a system setuptools. - - * Fixed a hole in sandboxing allowing builtin file to write outside of - the sandbox. - - ----- - 0.6.4 - ----- - - * Added the generation of `distribute_setup_3k.py` during the release. - This closes `Distribute #52 <https://bitbucket.org/tarek/distribute/issue/52>`_. - - * Added an upload_docs command to easily upload project documentation to - PyPI's https://pythonhosted.org. This close issue `Distribute #56 <https://bitbucket.org/tarek/distribute/issue/56>`_. - - * Fixed a bootstrap bug on the use_setuptools() API. - - ----- - 0.6.3 - ----- - - setuptools - ========== - - * Fixed a bunch of calls to file() that caused crashes on Python 3. - - bootstrapping - ============= - - * Fixed a bug in sorting that caused bootstrap to fail on Python 3. - - ----- - 0.6.2 - ----- - - setuptools - ========== - - * Added Python 3 support; see docs/python3.txt. - This closes `Old Setuptools #39 <http://bugs.python.org/setuptools/issue39>`_. - - * Added option to run 2to3 automatically when installing on Python 3. - This closes issue `Distribute #31 <https://bitbucket.org/tarek/distribute/issue/31>`_. - - * Fixed invalid usage of requirement.parse, that broke develop -d. - This closes `Old Setuptools #44 <http://bugs.python.org/setuptools/issue44>`_. - - * Fixed script launcher for 64-bit Windows. - This closes `Old Setuptools #2 <http://bugs.python.org/setuptools/issue2>`_. - - * KeyError when compiling extensions. - This closes `Old Setuptools #41 <http://bugs.python.org/setuptools/issue41>`_. - - bootstrapping - ============= - - * Fixed bootstrap not working on Windows. This closes issue `Distribute #49 <https://bitbucket.org/tarek/distribute/issue/49>`_. - - * Fixed 2.6 dependencies. This closes issue `Distribute #50 <https://bitbucket.org/tarek/distribute/issue/50>`_. - - * Make sure setuptools is patched when running through easy_install - This closes `Old Setuptools #40 <http://bugs.python.org/setuptools/issue40>`_. - - ----- - 0.6.1 - ----- - - setuptools - ========== - - * package_index.urlopen now catches BadStatusLine and malformed url errors. - This closes `Distribute #16 <https://bitbucket.org/tarek/distribute/issue/16>`_ and `Distribute #18 <https://bitbucket.org/tarek/distribute/issue/18>`_. - - * zip_ok is now False by default. This closes `Old Setuptools #33 <http://bugs.python.org/setuptools/issue33>`_. - - * Fixed invalid URL error catching. `Old Setuptools #20 <http://bugs.python.org/setuptools/issue20>`_. - - * Fixed invalid bootstraping with easy_install installation (`Distribute #40 <https://bitbucket.org/tarek/distribute/issue/40>`_). - Thanks to Florian Schulze for the help. - - * Removed buildout/bootstrap.py. A new repository will create a specific - bootstrap.py script. - - - bootstrapping - ============= - - * The boostrap process leave setuptools alone if detected in the system - and --root or --prefix is provided, but is not in the same location. - This closes `Distribute #10 <https://bitbucket.org/tarek/distribute/issue/10>`_. - - --- - 0.6 - --- - - setuptools - ========== - - * Packages required at build time where not fully present at install time. - This closes `Distribute #12 <https://bitbucket.org/tarek/distribute/issue/12>`_. - - * Protected against failures in tarfile extraction. This closes `Distribute #10 <https://bitbucket.org/tarek/distribute/issue/10>`_. - - * Made Jython api_tests.txt doctest compatible. This closes `Distribute #7 <https://bitbucket.org/tarek/distribute/issue/7>`_. - - * sandbox.py replaced builtin type file with builtin function open. This - closes `Distribute #6 <https://bitbucket.org/tarek/distribute/issue/6>`_. - - * Immediately close all file handles. This closes `Distribute #3 <https://bitbucket.org/tarek/distribute/issue/3>`_. - - * Added compatibility with Subversion 1.6. This references `Distribute #1 <https://bitbucket.org/tarek/distribute/issue/1>`_. - - pkg_resources - ============= - - * Avoid a call to /usr/bin/sw_vers on OSX and use the official platform API - instead. Based on a patch from ronaldoussoren. This closes issue `#5 <https://bitbucket.org/pypa/setuptools/issue/5>`_. - - * Fixed a SandboxViolation for mkdir that could occur in certain cases. - This closes `Distribute #13 <https://bitbucket.org/tarek/distribute/issue/13>`_. - - * Allow to find_on_path on systems with tight permissions to fail gracefully. - This closes `Distribute #9 <https://bitbucket.org/tarek/distribute/issue/9>`_. - - * Corrected inconsistency between documentation and code of add_entry. - This closes `Distribute #8 <https://bitbucket.org/tarek/distribute/issue/8>`_. - - * Immediately close all file handles. This closes `Distribute #3 <https://bitbucket.org/tarek/distribute/issue/3>`_. - - easy_install - ============ - - * Immediately close all file handles. This closes `Distribute #3 <https://bitbucket.org/tarek/distribute/issue/3>`_. - - -Keywords: CPAN PyPI distutils eggs package management -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: Python Software Foundation License -Classifier: License :: OSI Approved :: Zope Public License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 2.4 -Classifier: Programming Language :: Python :: 2.5 -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.1 -Classifier: Programming Language :: Python :: 3.2 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: System :: Archiving :: Packaging -Classifier: Topic :: System :: Systems Administration -Classifier: Topic :: Utilities diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/SOURCES.txt b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/SOURCES.txt deleted file mode 100644 index 202fe0d44..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/SOURCES.txt +++ /dev/null @@ -1,132 +0,0 @@ -CHANGES (links).txt -CHANGES.txt -CONTRIBUTORS.txt -DEVGUIDE.txt -MANIFEST.in -README.txt -easy_install.py -ez_setup.py -launcher.c -pkg_resources.py -release.py -setup.cfg -setup.py -_markerlib/__init__.py -_markerlib/markers.py -docs/Makefile -docs/conf.py -docs/easy_install.txt -docs/formats.txt -docs/index.txt -docs/merge-faq.txt -docs/merge.txt -docs/pkg_resources.txt -docs/python3.txt -docs/roadmap.txt -docs/setuptools.txt -docs/using.txt -docs/_templates/indexsidebar.html -docs/_theme/nature/theme.conf -docs/_theme/nature/static/nature.css_t -docs/_theme/nature/static/pygments.css -docs/build/html/_sources/easy_install.txt -docs/build/html/_sources/formats.txt -docs/build/html/_sources/index.txt -docs/build/html/_sources/merge-faq.txt -docs/build/html/_sources/merge.txt -docs/build/html/_sources/pkg_resources.txt -docs/build/html/_sources/python3.txt -docs/build/html/_sources/roadmap.txt -docs/build/html/_sources/setuptools.txt -docs/build/html/_sources/using.txt -docs/build/html/_static/basic.css -docs/build/html/_static/nature.css -docs/build/html/_static/pygments.css -setuptools/__init__.py -setuptools/archive_util.py -setuptools/cli-32.exe -setuptools/cli-64.exe -setuptools/cli-arm-32.exe -setuptools/cli.exe -setuptools/compat.py -setuptools/depends.py -setuptools/dist.py -setuptools/extension.py -setuptools/gui-32.exe -setuptools/gui-64.exe -setuptools/gui-arm-32.exe -setuptools/gui.exe -setuptools/package_index.py -setuptools/py24compat.py -setuptools/py27compat.py -setuptools/sandbox.py -setuptools/script template (dev).py -setuptools/script template.py -setuptools/site-patch.py -setuptools/ssl_support.py -setuptools.egg-info/PKG-INFO -setuptools.egg-info/SOURCES.txt -setuptools.egg-info/dependency_links.txt -setuptools.egg-info/entry_points.txt -setuptools.egg-info/entry_points.txt.orig -setuptools.egg-info/requires.txt -setuptools.egg-info/top_level.txt -setuptools.egg-info/zip-safe -setuptools/_backport/__init__.py -setuptools/_backport/hashlib/__init__.py -setuptools/_backport/hashlib/_sha.py -setuptools/_backport/hashlib/_sha256.py -setuptools/_backport/hashlib/_sha512.py -setuptools/command/__init__.py -setuptools/command/alias.py -setuptools/command/bdist_egg.py -setuptools/command/bdist_rpm.py -setuptools/command/bdist_wininst.py -setuptools/command/build_ext.py -setuptools/command/build_py.py -setuptools/command/develop.py -setuptools/command/easy_install.py -setuptools/command/egg_info.py -setuptools/command/install.py -setuptools/command/install_egg_info.py -setuptools/command/install_lib.py -setuptools/command/install_scripts.py -setuptools/command/launcher manifest.xml -setuptools/command/register.py -setuptools/command/rotate.py -setuptools/command/saveopts.py -setuptools/command/sdist.py -setuptools/command/setopt.py -setuptools/command/test.py -setuptools/command/upload.py -setuptools/command/upload_docs.py -setuptools/tests/__init__.py -setuptools/tests/doctest.py -setuptools/tests/entries-v10 -setuptools/tests/py26compat.py -setuptools/tests/server.py -setuptools/tests/test_bdist_egg.py -setuptools/tests/test_build_ext.py -setuptools/tests/test_develop.py -setuptools/tests/test_dist_info.py -setuptools/tests/test_easy_install.py -setuptools/tests/test_egg_info.py -setuptools/tests/test_markerlib.py -setuptools/tests/test_packageindex.py -setuptools/tests/test_resources.py -setuptools/tests/test_sandbox.py -setuptools/tests/test_sdist.py -setuptools/tests/test_test.py -setuptools/tests/test_upload_docs.py -setuptools/tests/win_script_wrapper.txt -setuptools/tests/indexes/test_links_priority/external.html -setuptools/tests/indexes/test_links_priority/simple/foobar/index.html -tests/api_tests.txt -tests/manual_test.py -tests/test_ez_setup.py -tests/test_pkg_resources.py -tests/shlib_test/hello.c -tests/shlib_test/hello.pyx -tests/shlib_test/hellolib.c -tests/shlib_test/setup.py -tests/shlib_test/test_hello.py \ No newline at end of file diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/dependency_links.txt b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/dependency_links.txt deleted file mode 100644 index c688b7eaa..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/dependency_links.txt +++ /dev/null @@ -1,6 +0,0 @@ -https://pypi.python.org/packages/source/c/certifi/certifi-0.0.8.tar.gz#md5=dc5f5e7f0b5fc08d27654b17daa6ecec -https://pypi.python.org/packages/source/s/ssl/ssl-1.16.tar.gz#md5=fb12d335d56f3c8c7c1fefc1c06c4bfb -https://pypi.python.org/packages/source/w/wincertstore/wincertstore-0.1.zip#md5=2f9accbebe8f7b4c06ac7aa83879b81c -https://bitbucket.org/pypa/setuptools/downloads/ctypes-1.0.2.win32-py2.4.exe#md5=9092a0ad5a3d79fa2d980f1ddc5e9dbc -https://bitbucket.org/pypa/setuptools/downloads/ssl-1.16-py2.4-win32.egg#md5=3cfa2c526dc66e318e8520b6f1aadce5 -https://bitbucket.org/pypa/setuptools/downloads/ssl-1.16-py2.5-win32.egg#md5=85ad1cda806d639743121c0bbcb5f39b diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/entry_points.txt b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/entry_points.txt deleted file mode 100644 index 663882d63..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/entry_points.txt +++ /dev/null @@ -1,62 +0,0 @@ -[distutils.commands] -bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm -rotate = setuptools.command.rotate:rotate -develop = setuptools.command.develop:develop -setopt = setuptools.command.setopt:setopt -build_py = setuptools.command.build_py:build_py -saveopts = setuptools.command.saveopts:saveopts -egg_info = setuptools.command.egg_info:egg_info -register = setuptools.command.register:register -upload_docs = setuptools.command.upload_docs:upload_docs -install_egg_info = setuptools.command.install_egg_info:install_egg_info -alias = setuptools.command.alias:alias -easy_install = setuptools.command.easy_install:easy_install -install_scripts = setuptools.command.install_scripts:install_scripts -bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst -bdist_egg = setuptools.command.bdist_egg:bdist_egg -install = setuptools.command.install:install -test = setuptools.command.test:test -install_lib = setuptools.command.install_lib:install_lib -build_ext = setuptools.command.build_ext:build_ext -sdist = setuptools.command.sdist:sdist - -[egg_info.writers] -dependency_links.txt = setuptools.command.egg_info:overwrite_arg -requires.txt = setuptools.command.egg_info:write_requirements -PKG-INFO = setuptools.command.egg_info:write_pkg_info -eager_resources.txt = setuptools.command.egg_info:overwrite_arg -top_level.txt = setuptools.command.egg_info:write_toplevel_names -namespace_packages.txt = setuptools.command.egg_info:overwrite_arg -entry_points.txt = setuptools.command.egg_info:write_entries -depends.txt = setuptools.command.egg_info:warn_depends_obsolete - -[console_scripts] -easy_install = setuptools.command.easy_install:main -easy_install-2.7 = setuptools.command.easy_install:main - -[setuptools.file_finders] -svn_cvs = setuptools.command.sdist:_default_revctrl - -[distutils.setup_keywords] -dependency_links = setuptools.dist:assert_string_list -entry_points = setuptools.dist:check_entry_points -extras_require = setuptools.dist:check_extras -use_2to3_exclude_fixers = setuptools.dist:assert_string_list -package_data = setuptools.dist:check_package_data -install_requires = setuptools.dist:check_requirements -use_2to3 = setuptools.dist:assert_bool -use_2to3_fixers = setuptools.dist:assert_string_list -include_package_data = setuptools.dist:assert_bool -exclude_package_data = setuptools.dist:check_package_data -namespace_packages = setuptools.dist:check_nsp -test_suite = setuptools.dist:check_test_suite -eager_resources = setuptools.dist:assert_string_list -zip_safe = setuptools.dist:assert_bool -test_loader = setuptools.dist:check_importable -packages = setuptools.dist:check_packages -convert_2to3_doctests = setuptools.dist:assert_string_list -tests_require = setuptools.dist:check_requirements - -[setuptools.installation] -eggsecutable = setuptools.command.easy_install:bootstrap - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/entry_points.txt.orig b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/entry_points.txt.orig deleted file mode 100644 index 13aaba712..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/entry_points.txt.orig +++ /dev/null @@ -1,62 +0,0 @@ -[distutils.setup_keywords] -use_2to3 = setuptools.dist:assert_bool -test_loader = setuptools.dist:check_importable -namespace_packages = setuptools.dist:check_nsp -use_2to3_exclude_fixers = setuptools.dist:assert_string_list -package_data = setuptools.dist:check_package_data -packages = setuptools.dist:check_packages -use_2to3_fixers = setuptools.dist:assert_string_list -dependency_links = setuptools.dist:assert_string_list -entry_points = setuptools.dist:check_entry_points -install_requires = setuptools.dist:check_requirements -tests_require = setuptools.dist:check_requirements -convert_2to3_doctests = setuptools.dist:assert_string_list -test_suite = setuptools.dist:check_test_suite -include_package_data = setuptools.dist:assert_bool -eager_resources = setuptools.dist:assert_string_list -exclude_package_data = setuptools.dist:check_package_data -zip_safe = setuptools.dist:assert_bool -extras_require = setuptools.dist:check_extras - -[distutils.commands] -upload_docs = setuptools.command.upload_docs:upload_docs -setopt = setuptools.command.setopt:setopt -install = setuptools.command.install:install -bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst -install_egg_info = setuptools.command.install_egg_info:install_egg_info -easy_install = setuptools.command.easy_install:easy_install -test = setuptools.command.test:test -saveopts = setuptools.command.saveopts:saveopts -sdist = setuptools.command.sdist:sdist -rotate = setuptools.command.rotate:rotate -bdist_egg = setuptools.command.bdist_egg:bdist_egg -build_py = setuptools.command.build_py:build_py -install_scripts = setuptools.command.install_scripts:install_scripts -develop = setuptools.command.develop:develop -install_lib = setuptools.command.install_lib:install_lib -alias = setuptools.command.alias:alias -build_ext = setuptools.command.build_ext:build_ext -register = setuptools.command.register:register -bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm -egg_info = setuptools.command.egg_info:egg_info - -[console_scripts] -easy_install = setuptools.command.easy_install:main -easy_install-3.3 = setuptools.command.easy_install:main - -[egg_info.writers] -entry_points.txt = setuptools.command.egg_info:write_entries -requires.txt = setuptools.command.egg_info:write_requirements -namespace_packages.txt = setuptools.command.egg_info:overwrite_arg -dependency_links.txt = setuptools.command.egg_info:overwrite_arg -PKG-INFO = setuptools.command.egg_info:write_pkg_info -depends.txt = setuptools.command.egg_info:warn_depends_obsolete -top_level.txt = setuptools.command.egg_info:write_toplevel_names -eager_resources.txt = setuptools.command.egg_info:overwrite_arg - -[setuptools.installation] -eggsecutable = setuptools.command.easy_install:bootstrap - -[setuptools.file_finders] -svn_cvs = setuptools.command.sdist:_default_revctrl - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/requires.txt b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/requires.txt deleted file mode 100644 index 91d84d9ca..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/requires.txt +++ /dev/null @@ -1,13 +0,0 @@ - - -[ssl:sys_platform=='win32'] -wincertstore==0.1 - -[ssl:sys_platform=='win32' and python_version=='2.4'] -ctypes==1.0.2 - -[certs] -certifi==0.0.8 - -[ssl:python_version in '2.4, 2.5'] -ssl==1.16 \ No newline at end of file diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/top_level.txt b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/top_level.txt deleted file mode 100644 index 5fe9a7ead..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/top_level.txt +++ /dev/null @@ -1,4 +0,0 @@ -_markerlib -easy_install -pkg_resources -setuptools diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/zip-safe b/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/zip-safe deleted file mode 100644 index 8b1378917..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools-0.9.8-py2.7.egg-info/zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/__init__.py b/PythonEnv/2.7/Lib/site-packages/setuptools/__init__.py deleted file mode 100644 index 8c708bd62..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/__init__.py +++ /dev/null @@ -1,94 +0,0 @@ -"""Extensions to the 'distutils' for large or complex distributions""" -from setuptools.extension import Extension, Library -from setuptools.dist import Distribution, Feature, _get_unpatched -import distutils.core, setuptools.command -from setuptools.depends import Require -from distutils.core import Command as _Command -from distutils.util import convert_path -import os -import sys - -__version__ = '0.9.8' -__all__ = [ - 'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require', - 'find_packages' -] - -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'] - -def find_packages(where='.', exclude=()): - """Return a list all Python packages found within directory 'where' - - 'where' 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). - """ - out = [] - stack=[(convert_path(where), '')] - while stack: - where,prefix = stack.pop(0) - for name in os.listdir(where): - fn = os.path.join(where,name) - if ('.' not in name and os.path.isdir(fn) and - os.path.isfile(os.path.join(fn,'__init__.py')) - ): - out.append(prefix+name); stack.append((fn,prefix+name+'.')) - for pat in list(exclude)+['ez_setup']: - from fnmatch import fnmatchcase - out = [item for item in out if not fnmatchcase(item,pat)] - return out - -setup = distutils.core.setup - -_Command = _get_unpatched(_Command) - -class Command(_Command): - __doc__ = _Command.__doc__ - - command_consumes_arguments = False - - def __init__(self, dist, **kw): - # Add support for keyword arguments - _Command.__init__(self,dist) - for k,v in kw.items(): - setattr(self,k,v) - - def reinitialize_command(self, command, reinit_subcommands=0, **kw): - cmd = _Command.reinitialize_command(self, command, reinit_subcommands) - for k,v in kw.items(): - setattr(cmd,k,v) # update command with keywords - return cmd - -import distutils.core -distutils.core.Command = Command # we can't patch distutils.cmd, alas - -def findall(dir = os.curdir): - """Find all files under 'dir' and return the list of full filenames - (relative to 'dir'). - """ - all_files = [] - for base, dirs, files in os.walk(dir): - if base==os.curdir or base.startswith(os.curdir+os.sep): - base = base[2:] - if base: - files = [os.path.join(base, f) for f in files] - all_files.extend(filter(os.path.isfile, files)) - return all_files - -import distutils.filelist -distutils.filelist.findall = findall # fix findall bug in distutils. - -# sys.dont_write_bytecode was introduced in Python 2.6. -if ((hasattr(sys, "dont_write_bytecode") and sys.dont_write_bytecode) or - (not hasattr(sys, "dont_write_bytecode") and os.environ.get("PYTHONDONTWRITEBYTECODE"))): - _dont_write_bytecode = True -else: - _dont_write_bytecode = False diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/__init__.pyc deleted file mode 100644 index a3257e8e1cc8e9099f638658bff5729c10b1d326..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4216 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 Nt^igx)fNipe*r23>a73( diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/__init__.py b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/__init__.pyc deleted file mode 100644 index 982080c9b512d31df64b46ae21c0a3dca240a0a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191 zcmZSn%*&Oe`y?=#0SXv_v;z<qvjB+{28Lh_kcgiKkYGR~iZeh;tYXqLOEOB6V!|`? z9COl&Qd5vvNtt;uE~!bS=`jJ7B^mj7u6boKMtbHkKAA}|#hE3kx&?{J*@@|?#WBUH zC8Y%=`T04;G4V-2!Gipvl9>4T%)HE!_;|g7$`THsWj49_DWy57b|5De12F>tFYz+x diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/__init__.py b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/__init__.py deleted file mode 100644 index 5aeab496a..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/__init__.py +++ /dev/null @@ -1,146 +0,0 @@ -# $Id$ -# -# Copyright (C) 2005 Gregory P. Smith (greg@krypto.org) -# Licensed to PSF under a Contributor Agreement. -# - -__doc__ = """hashlib module - A common interface to many hash functions. - -new(name, string='') - returns a new hash object implementing the - given hash function; initializing the hash - using the given string data. - -Named constructor functions are also available, these are much faster -than using new(): - -md5(), sha1(), sha224(), sha256(), sha384(), and sha512() - -More algorithms may be available on your platform but the above are -guaranteed to exist. - -NOTE: If you want the adler32 or crc32 hash functions they are available in -the zlib module. - -Choose your hash function wisely. Some have known collision weaknesses. -sha384 and sha512 will be slow on 32 bit platforms. - -Hash objects have these methods: - - update(arg): Update the hash object with the string arg. Repeated calls - are equivalent to a single call with the concatenation of all - the arguments. - - digest(): Return the digest of the strings passed to the update() method - so far. This may contain non-ASCII characters, including - NUL bytes. - - hexdigest(): Like digest() except the digest is returned as a string of - double length, containing only hexadecimal digits. - - copy(): Return a copy (clone) of the hash object. This can be used to - efficiently compute the digests of strings that share a common - initial substring. - -For example, to obtain the digest of the string 'Nobody inspects the -spammish repetition': - - >>> import hashlib - >>> m = hashlib.md5() - >>> m.update("Nobody inspects") - >>> m.update(" the spammish repetition") - >>> m.digest() - '\\xbbd\\x9c\\x83\\xdd\\x1e\\xa5\\xc9\\xd9\\xde\\xc9\\xa1\\x8d\\xf0\\xff\\xe9' - -More condensed: - - >>> hashlib.sha224("Nobody inspects the spammish repetition").hexdigest() - 'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2' - -""" - -# This tuple and __get_builtin_constructor() must be modified if a new -# always available algorithm is added. -__always_supported = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512') - -algorithms = __always_supported - -__all__ = __always_supported + ('new', 'algorithms') - - -def __get_builtin_constructor(name): - try: - if name in ('SHA1', 'sha1'): - import _sha - return _sha.new - elif name in ('MD5', 'md5'): - import md5 - return md5.new - elif name in ('SHA256', 'sha256', 'SHA224', 'sha224'): - import _sha256 - bs = name[3:] - if bs == '256': - return _sha256.sha256 - elif bs == '224': - return _sha256.sha224 - elif name in ('SHA512', 'sha512', 'SHA384', 'sha384'): - import _sha512 - bs = name[3:] - if bs == '512': - return _sha512.sha512 - elif bs == '384': - return _sha512.sha384 - except ImportError: - pass # no extension module, this hash is unsupported. - - raise ValueError('unsupported hash type %s' % name) - - -def __get_openssl_constructor(name): - try: - f = getattr(_hashlib, 'openssl_' + name) - # Allow the C module to raise ValueError. The function will be - # defined but the hash not actually available thanks to OpenSSL. - f() - # Use the C function directly (very fast) - return f - except (AttributeError, ValueError): - return __get_builtin_constructor(name) - - -def __py_new(name, string=''): - """new(name, string='') - Return a new hashing object using the named algorithm; - optionally initialized with a string. - """ - return __get_builtin_constructor(name)(string) - - -def __hash_new(name, string=''): - """new(name, string='') - Return a new hashing object using the named algorithm; - optionally initialized with a string. - """ - try: - return _hashlib.new(name, string) - except ValueError: - # If the _hashlib module (OpenSSL) doesn't support the named - # hash, try using our builtin implementations. - # This allows for SHA224/256 and SHA384/512 support even though - # the OpenSSL library prior to 0.9.8 doesn't provide them. - return __get_builtin_constructor(name)(string) - - -try: - import _hashlib - new = __hash_new - __get_hash = __get_openssl_constructor -except ImportError: - new = __py_new - __get_hash = __get_builtin_constructor - -for __func_name in __always_supported: - # try them all, some may not work due to the OpenSSL - # version not supporting that algorithm. - try: - globals()[__func_name] = __get_hash(__func_name) - except ValueError: - import logging - logging.exception('code for hash %s was not found.', __func_name) - -# Cleanup locals() -del __always_supported, __func_name, __get_hash -del __py_new, __hash_new, __get_openssl_constructor diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/__init__.pyc deleted file mode 100644 index 19af21fa4e7ebc591faa62a3fccde4f21240c285..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4847 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 G>--NN2LgZq diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha.py b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha.py deleted file mode 100644 index d49993c88..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha.py +++ /dev/null @@ -1,359 +0,0 @@ -# -*- coding: iso-8859-1 -*- -"""A sample implementation of SHA-1 in pure Python. - - Framework adapted from Dinu Gherman's MD5 implementation by - J. Hallén and L. Creighton. SHA-1 implementation based directly on - the text of the NIST standard FIPS PUB 180-1. -""" - - -__date__ = '2004-11-17' -__version__ = 0.91 # Modernised by J. Hallén and L. Creighton for Pypy - - -import struct, copy - - -# ====================================================================== -# Bit-Manipulation helpers -# -# _long2bytes() was contributed by Barry Warsaw -# and is reused here with tiny modifications. -# ====================================================================== - -def _long2bytesBigEndian(n, blocksize=0): - """Convert a long integer to a byte string. - - If optional blocksize is given and greater than zero, pad the front - of the byte string with binary zeros so that the length is a multiple - of blocksize. - """ - - # After much testing, this algorithm was deemed to be the fastest. - s = '' - pack = struct.pack - while n > 0: - s = pack('>I', n & 0xffffffff) + s - n = n >> 32 - - # Strip off leading zeros. - for i in range(len(s)): - if s[i] != '\000': - break - else: - # Only happens when n == 0. - s = '\000' - i = 0 - - s = s[i:] - - # Add back some pad bytes. This could be done more efficiently - # w.r.t. the de-padding being done above, but sigh... - if blocksize > 0 and len(s) % blocksize: - s = (blocksize - len(s) % blocksize) * '\000' + s - - return s - - -def _bytelist2longBigEndian(list): - "Transform a list of characters into a list of longs." - - imax = len(list) // 4 - hl = [0] * imax - - j = 0 - i = 0 - while i < imax: - b0 = ord(list[j]) << 24 - b1 = ord(list[j+1]) << 16 - b2 = ord(list[j+2]) << 8 - b3 = ord(list[j+3]) - hl[i] = b0 | b1 | b2 | b3 - i = i+1 - j = j+4 - - return hl - - -def _rotateLeft(x, n): - "Rotate x (32 bit) left n bits circularly." - - return (x << n) | (x >> (32-n)) - - -# ====================================================================== -# The SHA transformation functions -# -# ====================================================================== - -def f0_19(B, C, D): - return (B & C) | ((~ B) & D) - -def f20_39(B, C, D): - return B ^ C ^ D - -def f40_59(B, C, D): - return (B & C) | (B & D) | (C & D) - -def f60_79(B, C, D): - return B ^ C ^ D - - -f = [f0_19, f20_39, f40_59, f60_79] - -# Constants to be used -K = [ - 0x5A827999, # ( 0 <= t <= 19) - 0x6ED9EBA1, # (20 <= t <= 39) - 0x8F1BBCDC, # (40 <= t <= 59) - 0xCA62C1D6 # (60 <= t <= 79) - ] - -class sha: - "An implementation of the MD5 hash function in pure Python." - - digest_size = digestsize = 20 - block_size = 1 - - def __init__(self): - "Initialisation." - - # Initial message length in bits(!). - self.length = 0 - self.count = [0, 0] - - # Initial empty message as a sequence of bytes (8 bit characters). - self.input = [] - - # Call a separate init function, that can be used repeatedly - # to start from scratch on the same object. - self.init() - - - def init(self): - "Initialize the message-digest and set all fields to zero." - - self.length = 0 - self.input = [] - - # Initial 160 bit message digest (5 times 32 bit). - self.H0 = 0x67452301 - self.H1 = 0xEFCDAB89 - self.H2 = 0x98BADCFE - self.H3 = 0x10325476 - self.H4 = 0xC3D2E1F0 - - def _transform(self, W): - - for t in range(16, 80): - W.append(_rotateLeft( - W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1) & 0xffffffff) - - A = self.H0 - B = self.H1 - C = self.H2 - D = self.H3 - E = self.H4 - - """ - This loop was unrolled to gain about 10% in speed - for t in range(0, 80): - TEMP = _rotateLeft(A, 5) + f[t/20] + E + W[t] + K[t/20] - E = D - D = C - C = _rotateLeft(B, 30) & 0xffffffff - B = A - A = TEMP & 0xffffffff - """ - - for t in range(0, 20): - TEMP = _rotateLeft(A, 5) + ((B & C) | ((~ B) & D)) + E + W[t] + K[0] - E = D - D = C - C = _rotateLeft(B, 30) & 0xffffffff - B = A - A = TEMP & 0xffffffff - - for t in range(20, 40): - TEMP = _rotateLeft(A, 5) + (B ^ C ^ D) + E + W[t] + K[1] - E = D - D = C - C = _rotateLeft(B, 30) & 0xffffffff - B = A - A = TEMP & 0xffffffff - - for t in range(40, 60): - TEMP = _rotateLeft(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2] - E = D - D = C - C = _rotateLeft(B, 30) & 0xffffffff - B = A - A = TEMP & 0xffffffff - - for t in range(60, 80): - TEMP = _rotateLeft(A, 5) + (B ^ C ^ D) + E + W[t] + K[3] - E = D - D = C - C = _rotateLeft(B, 30) & 0xffffffff - B = A - A = TEMP & 0xffffffff - - - self.H0 = (self.H0 + A) & 0xffffffff - self.H1 = (self.H1 + B) & 0xffffffff - self.H2 = (self.H2 + C) & 0xffffffff - self.H3 = (self.H3 + D) & 0xffffffff - self.H4 = (self.H4 + E) & 0xffffffff - - - # Down from here all methods follow the Python Standard Library - # API of the sha module. - - def update(self, inBuf): - """Add to the current message. - - Update the md5 object with the string arg. Repeated calls - are equivalent to a single call with the concatenation of all - the arguments, i.e. m.update(a); m.update(b) is equivalent - to m.update(a+b). - - The hash is immediately calculated for all full blocks. The final - calculation is made in digest(). It will calculate 1-2 blocks, - depending on how much padding we have to add. This allows us to - keep an intermediate value for the hash, so that we only need to - make minimal recalculation if we call update() to add more data - to the hashed string. - """ - - leninBuf = len(inBuf) - - # Compute number of bytes mod 64. - index = (self.count[1] >> 3) & 0x3F - - # Update number of bits. - self.count[1] = self.count[1] + (leninBuf << 3) - if self.count[1] < (leninBuf << 3): - self.count[0] = self.count[0] + 1 - self.count[0] = self.count[0] + (leninBuf >> 29) - - partLen = 64 - index - - if leninBuf >= partLen: - self.input[index:] = list(inBuf[:partLen]) - self._transform(_bytelist2longBigEndian(self.input)) - i = partLen - while i + 63 < leninBuf: - self._transform(_bytelist2longBigEndian(list(inBuf[i:i+64]))) - i = i + 64 - else: - self.input = list(inBuf[i:leninBuf]) - else: - i = 0 - self.input = self.input + list(inBuf) - - - def digest(self): - """Terminate the message-digest computation and return digest. - - Return the digest of the strings passed to the update() - method so far. This is a 16-byte string which may contain - non-ASCII characters, including null bytes. - """ - - H0 = self.H0 - H1 = self.H1 - H2 = self.H2 - H3 = self.H3 - H4 = self.H4 - input = [] + self.input - count = [] + self.count - - index = (self.count[1] >> 3) & 0x3f - - if index < 56: - padLen = 56 - index - else: - padLen = 120 - index - - padding = ['\200'] + ['\000'] * 63 - self.update(padding[:padLen]) - - # Append length (before padding). - bits = _bytelist2longBigEndian(self.input[:56]) + count - - self._transform(bits) - - # Store state in digest. - digest = _long2bytesBigEndian(self.H0, 4) + \ - _long2bytesBigEndian(self.H1, 4) + \ - _long2bytesBigEndian(self.H2, 4) + \ - _long2bytesBigEndian(self.H3, 4) + \ - _long2bytesBigEndian(self.H4, 4) - - self.H0 = H0 - self.H1 = H1 - self.H2 = H2 - self.H3 = H3 - self.H4 = H4 - self.input = input - self.count = count - - return digest - - - def hexdigest(self): - """Terminate and return digest in HEX form. - - Like digest() except the digest is returned as a string of - length 32, containing only hexadecimal digits. This may be - used to exchange the value safely in email or other non- - binary environments. - """ - return ''.join(['%02x' % ord(c) for c in self.digest()]) - - def copy(self): - """Return a clone object. - - Return a copy ('clone') of the md5 object. This can be used - to efficiently compute the digests of strings that share - a common initial substring. - """ - - return copy.deepcopy(self) - - -# ====================================================================== -# Mimic Python top-level functions from standard library API -# for consistency with the _sha module of the standard library. -# ====================================================================== - -# These are mandatory variables in the module. They have constant values -# in the SHA standard. - -digest_size = 20 -digestsize = 20 -blocksize = 1 - -def new(arg=None): - """Return a new sha crypto object. - - If arg is present, the method call update(arg) is made. - """ - - crypto = sha() - if arg: - crypto.update(arg) - - return crypto - - -if __name__ == "__main__": - a_str = "just a test string" - - assert 'da39a3ee5e6b4b0d3255bfef95601890afd80709' == new().hexdigest() - assert '3f0cf2e3d9e5903e839417dfc47fed6bfa6457f6' == new(a_str).hexdigest() - assert '0852b254078fe3772568a4aba37b917f3d4066ba' == new(a_str*7).hexdigest() - - s = new(a_str) - s.update(a_str) - assert '8862c1b50967f39d3db6bdc2877d9ccebd3102e5' == s.hexdigest() diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha.pyc deleted file mode 100644 index 39328b2a48928fc35820e8184321d83126c29afd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9874 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 CWAvy1 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha256.py b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha256.py deleted file mode 100644 index 805dbd086..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha256.py +++ /dev/null @@ -1,260 +0,0 @@ -import struct - -SHA_BLOCKSIZE = 64 -SHA_DIGESTSIZE = 32 - - -def new_shaobject(): - return { - 'digest': [0]*8, - 'count_lo': 0, - 'count_hi': 0, - 'data': [0]* SHA_BLOCKSIZE, - 'local': 0, - 'digestsize': 0 - } - -ROR = lambda x, y: (((x & 0xffffffff) >> (y & 31)) | (x << (32 - (y & 31)))) & 0xffffffff -Ch = lambda x, y, z: (z ^ (x & (y ^ z))) -Maj = lambda x, y, z: (((x | y) & z) | (x & y)) -S = lambda x, n: ROR(x, n) -R = lambda x, n: (x & 0xffffffff) >> n -Sigma0 = lambda x: (S(x, 2) ^ S(x, 13) ^ S(x, 22)) -Sigma1 = lambda x: (S(x, 6) ^ S(x, 11) ^ S(x, 25)) -Gamma0 = lambda x: (S(x, 7) ^ S(x, 18) ^ R(x, 3)) -Gamma1 = lambda x: (S(x, 17) ^ S(x, 19) ^ R(x, 10)) - -def sha_transform(sha_info): - W = [] - - d = sha_info['data'] - for i in xrange(0,16): - W.append( (d[4*i]<<24) + (d[4*i+1]<<16) + (d[4*i+2]<<8) + d[4*i+3]) - - for i in xrange(16,64): - W.append( (Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]) & 0xffffffff ) - - ss = sha_info['digest'][:] - - def RND(a,b,c,d,e,f,g,h,i,ki): - t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i]; - t1 = Sigma0(a) + Maj(a, b, c); - d += t0; - h = t0 + t1; - return d & 0xffffffff, h & 0xffffffff - - ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],0,0x428a2f98); - ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],1,0x71374491); - ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],2,0xb5c0fbcf); - ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],3,0xe9b5dba5); - ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],4,0x3956c25b); - ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],5,0x59f111f1); - ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],6,0x923f82a4); - ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],7,0xab1c5ed5); - ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],8,0xd807aa98); - ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],9,0x12835b01); - ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],10,0x243185be); - ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],11,0x550c7dc3); - ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],12,0x72be5d74); - ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],13,0x80deb1fe); - ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],14,0x9bdc06a7); - ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],15,0xc19bf174); - ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],16,0xe49b69c1); - ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],17,0xefbe4786); - ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],18,0x0fc19dc6); - ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],19,0x240ca1cc); - ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],20,0x2de92c6f); - ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],21,0x4a7484aa); - ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],22,0x5cb0a9dc); - ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],23,0x76f988da); - ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],24,0x983e5152); - ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],25,0xa831c66d); - ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],26,0xb00327c8); - ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],27,0xbf597fc7); - ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],28,0xc6e00bf3); - ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],29,0xd5a79147); - ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],30,0x06ca6351); - ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],31,0x14292967); - ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],32,0x27b70a85); - ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],33,0x2e1b2138); - ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],34,0x4d2c6dfc); - ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],35,0x53380d13); - ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],36,0x650a7354); - ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],37,0x766a0abb); - ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],38,0x81c2c92e); - ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],39,0x92722c85); - ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],40,0xa2bfe8a1); - ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],41,0xa81a664b); - ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],42,0xc24b8b70); - ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],43,0xc76c51a3); - ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],44,0xd192e819); - ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],45,0xd6990624); - ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],46,0xf40e3585); - ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],47,0x106aa070); - ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],48,0x19a4c116); - ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],49,0x1e376c08); - ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],50,0x2748774c); - ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],51,0x34b0bcb5); - ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],52,0x391c0cb3); - ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],53,0x4ed8aa4a); - ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],54,0x5b9cca4f); - ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],55,0x682e6ff3); - ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],56,0x748f82ee); - ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],57,0x78a5636f); - ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],58,0x84c87814); - ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],59,0x8cc70208); - ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],60,0x90befffa); - ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],61,0xa4506ceb); - ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],62,0xbef9a3f7); - ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],63,0xc67178f2); - - dig = [] - for i, x in enumerate(sha_info['digest']): - dig.append( (x + ss[i]) & 0xffffffff ) - sha_info['digest'] = dig - -def sha_init(): - sha_info = new_shaobject() - sha_info['digest'] = [0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19] - sha_info['count_lo'] = 0 - sha_info['count_hi'] = 0 - sha_info['local'] = 0 - sha_info['digestsize'] = 32 - return sha_info - -def sha224_init(): - sha_info = new_shaobject() - sha_info['digest'] = [0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4] - sha_info['count_lo'] = 0 - sha_info['count_hi'] = 0 - sha_info['local'] = 0 - sha_info['digestsize'] = 28 - return sha_info - -def getbuf(s): - if isinstance(s, str): - return s - elif isinstance(s, unicode): - return str(s) - else: - return buffer(s) - -def sha_update(sha_info, buffer): - count = len(buffer) - buffer_idx = 0 - clo = (sha_info['count_lo'] + (count << 3)) & 0xffffffff - if clo < sha_info['count_lo']: - sha_info['count_hi'] += 1 - sha_info['count_lo'] = clo - - sha_info['count_hi'] += (count >> 29) - - if sha_info['local']: - i = SHA_BLOCKSIZE - sha_info['local'] - if i > count: - i = count - - # copy buffer - for x in enumerate(buffer[buffer_idx:buffer_idx+i]): - sha_info['data'][sha_info['local']+x[0]] = struct.unpack('B', x[1])[0] - - count -= i - buffer_idx += i - - sha_info['local'] += i - if sha_info['local'] == SHA_BLOCKSIZE: - sha_transform(sha_info) - sha_info['local'] = 0 - else: - return - - while count >= SHA_BLOCKSIZE: - # copy buffer - sha_info['data'] = [struct.unpack('B',c)[0] for c in buffer[buffer_idx:buffer_idx + SHA_BLOCKSIZE]] - count -= SHA_BLOCKSIZE - buffer_idx += SHA_BLOCKSIZE - sha_transform(sha_info) - - - # copy buffer - pos = sha_info['local'] - sha_info['data'][pos:pos+count] = [struct.unpack('B',c)[0] for c in buffer[buffer_idx:buffer_idx + count]] - sha_info['local'] = count - -def sha_final(sha_info): - lo_bit_count = sha_info['count_lo'] - hi_bit_count = sha_info['count_hi'] - count = (lo_bit_count >> 3) & 0x3f - sha_info['data'][count] = 0x80; - count += 1 - if count > SHA_BLOCKSIZE - 8: - # zero the bytes in data after the count - sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count)) - sha_transform(sha_info) - # zero bytes in data - sha_info['data'] = [0] * SHA_BLOCKSIZE - else: - sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count)) - - sha_info['data'][56] = (hi_bit_count >> 24) & 0xff - sha_info['data'][57] = (hi_bit_count >> 16) & 0xff - sha_info['data'][58] = (hi_bit_count >> 8) & 0xff - sha_info['data'][59] = (hi_bit_count >> 0) & 0xff - sha_info['data'][60] = (lo_bit_count >> 24) & 0xff - sha_info['data'][61] = (lo_bit_count >> 16) & 0xff - sha_info['data'][62] = (lo_bit_count >> 8) & 0xff - sha_info['data'][63] = (lo_bit_count >> 0) & 0xff - - sha_transform(sha_info) - - dig = [] - for i in sha_info['digest']: - dig.extend([ ((i>>24) & 0xff), ((i>>16) & 0xff), ((i>>8) & 0xff), (i & 0xff) ]) - return ''.join([chr(i) for i in dig]) - -class sha256(object): - digest_size = digestsize = SHA_DIGESTSIZE - block_size = SHA_BLOCKSIZE - - def __init__(self, s=None): - self._sha = sha_init() - if s: - sha_update(self._sha, getbuf(s)) - - def update(self, s): - sha_update(self._sha, getbuf(s)) - - def digest(self): - return sha_final(self._sha.copy())[:self._sha['digestsize']] - - def hexdigest(self): - return ''.join(['%.2x' % ord(i) for i in self.digest()]) - - def copy(self): - new = sha256.__new__(sha256) - new._sha = self._sha.copy() - return new - -class sha224(sha256): - digest_size = digestsize = 28 - - def __init__(self, s=None): - self._sha = sha224_init() - if s: - sha_update(self._sha, getbuf(s)) - - def copy(self): - new = sha224.__new__(sha224) - new._sha = self._sha.copy() - return new - -if __name__ == "__main__": - a_str = "just a test string" - - assert 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' == sha256().hexdigest() - assert 'd7b553c6f09ac85d142415f857c5310f3bbbe7cdd787cce4b985acedd585266f' == sha256(a_str).hexdigest() - assert '8113ebf33c97daa9998762aacafe750c7cefc2b2f173c90c59663a57fe626f21' == sha256(a_str*7).hexdigest() - - s = sha256(a_str) - s.update(a_str) - assert '03d9963e05a094593190b6fc794cb1a3e1ac7d7883f0b5855268afeccc70d461' == s.hexdigest() diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha256.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha256.pyc deleted file mode 100644 index 356c43df7d6c4b6227ec45d495b9e47235bb4532..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16462 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 I-RiLZAA=E!D*ylh diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha512.py b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha512.py deleted file mode 100644 index 68ff46f30..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha512.py +++ /dev/null @@ -1,288 +0,0 @@ -""" -This code was Ported from CPython's sha512module.c -""" - -import struct - -SHA_BLOCKSIZE = 128 -SHA_DIGESTSIZE = 64 - - -def new_shaobject(): - return { - 'digest': [0]*8, - 'count_lo': 0, - 'count_hi': 0, - 'data': [0]* SHA_BLOCKSIZE, - 'local': 0, - 'digestsize': 0 - } - -ROR64 = lambda x, y: (((x & 0xffffffffffffffff) >> (y & 63)) | (x << (64 - (y & 63)))) & 0xffffffffffffffff -Ch = lambda x, y, z: (z ^ (x & (y ^ z))) -Maj = lambda x, y, z: (((x | y) & z) | (x & y)) -S = lambda x, n: ROR64(x, n) -R = lambda x, n: (x & 0xffffffffffffffff) >> n -Sigma0 = lambda x: (S(x, 28) ^ S(x, 34) ^ S(x, 39)) -Sigma1 = lambda x: (S(x, 14) ^ S(x, 18) ^ S(x, 41)) -Gamma0 = lambda x: (S(x, 1) ^ S(x, 8) ^ R(x, 7)) -Gamma1 = lambda x: (S(x, 19) ^ S(x, 61) ^ R(x, 6)) - -def sha_transform(sha_info): - W = [] - - d = sha_info['data'] - for i in xrange(0,16): - W.append( (d[8*i]<<56) + (d[8*i+1]<<48) + (d[8*i+2]<<40) + (d[8*i+3]<<32) + (d[8*i+4]<<24) + (d[8*i+5]<<16) + (d[8*i+6]<<8) + d[8*i+7]) - - for i in xrange(16,80): - W.append( (Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]) & 0xffffffffffffffff ) - - ss = sha_info['digest'][:] - - def RND(a,b,c,d,e,f,g,h,i,ki): - t0 = (h + Sigma1(e) + Ch(e, f, g) + ki + W[i]) & 0xffffffffffffffff - t1 = (Sigma0(a) + Maj(a, b, c)) & 0xffffffffffffffff - d = (d + t0) & 0xffffffffffffffff - h = (t0 + t1) & 0xffffffffffffffff - return d & 0xffffffffffffffff, h & 0xffffffffffffffff - - ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],0,0x428a2f98d728ae22) - ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],1,0x7137449123ef65cd) - ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],2,0xb5c0fbcfec4d3b2f) - ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],3,0xe9b5dba58189dbbc) - ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],4,0x3956c25bf348b538) - ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],5,0x59f111f1b605d019) - ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],6,0x923f82a4af194f9b) - ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],7,0xab1c5ed5da6d8118) - ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],8,0xd807aa98a3030242) - ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],9,0x12835b0145706fbe) - ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],10,0x243185be4ee4b28c) - ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],11,0x550c7dc3d5ffb4e2) - ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],12,0x72be5d74f27b896f) - ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],13,0x80deb1fe3b1696b1) - ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],14,0x9bdc06a725c71235) - ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],15,0xc19bf174cf692694) - ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],16,0xe49b69c19ef14ad2) - ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],17,0xefbe4786384f25e3) - ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],18,0x0fc19dc68b8cd5b5) - ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],19,0x240ca1cc77ac9c65) - ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],20,0x2de92c6f592b0275) - ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],21,0x4a7484aa6ea6e483) - ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],22,0x5cb0a9dcbd41fbd4) - ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],23,0x76f988da831153b5) - ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],24,0x983e5152ee66dfab) - ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],25,0xa831c66d2db43210) - ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],26,0xb00327c898fb213f) - ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],27,0xbf597fc7beef0ee4) - ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],28,0xc6e00bf33da88fc2) - ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],29,0xd5a79147930aa725) - ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],30,0x06ca6351e003826f) - ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],31,0x142929670a0e6e70) - ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],32,0x27b70a8546d22ffc) - ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],33,0x2e1b21385c26c926) - ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],34,0x4d2c6dfc5ac42aed) - ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],35,0x53380d139d95b3df) - ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],36,0x650a73548baf63de) - ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],37,0x766a0abb3c77b2a8) - ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],38,0x81c2c92e47edaee6) - ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],39,0x92722c851482353b) - ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],40,0xa2bfe8a14cf10364) - ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],41,0xa81a664bbc423001) - ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],42,0xc24b8b70d0f89791) - ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],43,0xc76c51a30654be30) - ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],44,0xd192e819d6ef5218) - ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],45,0xd69906245565a910) - ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],46,0xf40e35855771202a) - ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],47,0x106aa07032bbd1b8) - ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],48,0x19a4c116b8d2d0c8) - ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],49,0x1e376c085141ab53) - ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],50,0x2748774cdf8eeb99) - ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],51,0x34b0bcb5e19b48a8) - ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],52,0x391c0cb3c5c95a63) - ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],53,0x4ed8aa4ae3418acb) - ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],54,0x5b9cca4f7763e373) - ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],55,0x682e6ff3d6b2b8a3) - ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],56,0x748f82ee5defb2fc) - ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],57,0x78a5636f43172f60) - ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],58,0x84c87814a1f0ab72) - ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],59,0x8cc702081a6439ec) - ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],60,0x90befffa23631e28) - ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],61,0xa4506cebde82bde9) - ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],62,0xbef9a3f7b2c67915) - ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],63,0xc67178f2e372532b) - ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],64,0xca273eceea26619c) - ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],65,0xd186b8c721c0c207) - ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],66,0xeada7dd6cde0eb1e) - ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],67,0xf57d4f7fee6ed178) - ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],68,0x06f067aa72176fba) - ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],69,0x0a637dc5a2c898a6) - ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],70,0x113f9804bef90dae) - ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],71,0x1b710b35131c471b) - ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],72,0x28db77f523047d84) - ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],73,0x32caab7b40c72493) - ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],74,0x3c9ebe0a15c9bebc) - ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],75,0x431d67c49c100d4c) - ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],76,0x4cc5d4becb3e42b6) - ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],77,0x597f299cfc657e2a) - ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],78,0x5fcb6fab3ad6faec) - ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],79,0x6c44198c4a475817) - - dig = [] - for i, x in enumerate(sha_info['digest']): - dig.append( (x + ss[i]) & 0xffffffffffffffff ) - sha_info['digest'] = dig - -def sha_init(): - sha_info = new_shaobject() - sha_info['digest'] = [ 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179] - sha_info['count_lo'] = 0 - sha_info['count_hi'] = 0 - sha_info['local'] = 0 - sha_info['digestsize'] = 64 - return sha_info - -def sha384_init(): - sha_info = new_shaobject() - sha_info['digest'] = [ 0xcbbb9d5dc1059ed8, 0x629a292a367cd507, 0x9159015a3070dd17, 0x152fecd8f70e5939, 0x67332667ffc00b31, 0x8eb44a8768581511, 0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4] - sha_info['count_lo'] = 0 - sha_info['count_hi'] = 0 - sha_info['local'] = 0 - sha_info['digestsize'] = 48 - return sha_info - -def getbuf(s): - if isinstance(s, str): - return s - elif isinstance(s, unicode): - return str(s) - else: - return buffer(s) - -def sha_update(sha_info, buffer): - count = len(buffer) - buffer_idx = 0 - clo = (sha_info['count_lo'] + (count << 3)) & 0xffffffff - if clo < sha_info['count_lo']: - sha_info['count_hi'] += 1 - sha_info['count_lo'] = clo - - sha_info['count_hi'] += (count >> 29) - - if sha_info['local']: - i = SHA_BLOCKSIZE - sha_info['local'] - if i > count: - i = count - - # copy buffer - for x in enumerate(buffer[buffer_idx:buffer_idx+i]): - sha_info['data'][sha_info['local']+x[0]] = struct.unpack('B', x[1])[0] - - count -= i - buffer_idx += i - - sha_info['local'] += i - if sha_info['local'] == SHA_BLOCKSIZE: - sha_transform(sha_info) - sha_info['local'] = 0 - else: - return - - while count >= SHA_BLOCKSIZE: - # copy buffer - sha_info['data'] = [struct.unpack('B',c)[0] for c in buffer[buffer_idx:buffer_idx + SHA_BLOCKSIZE]] - count -= SHA_BLOCKSIZE - buffer_idx += SHA_BLOCKSIZE - sha_transform(sha_info) - - # copy buffer - pos = sha_info['local'] - sha_info['data'][pos:pos+count] = [struct.unpack('B',c)[0] for c in buffer[buffer_idx:buffer_idx + count]] - sha_info['local'] = count - -def sha_final(sha_info): - lo_bit_count = sha_info['count_lo'] - hi_bit_count = sha_info['count_hi'] - count = (lo_bit_count >> 3) & 0x7f - sha_info['data'][count] = 0x80; - count += 1 - if count > SHA_BLOCKSIZE - 16: - # zero the bytes in data after the count - sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count)) - sha_transform(sha_info) - # zero bytes in data - sha_info['data'] = [0] * SHA_BLOCKSIZE - else: - sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count)) - - sha_info['data'][112] = 0; - sha_info['data'][113] = 0; - sha_info['data'][114] = 0; - sha_info['data'][115] = 0; - sha_info['data'][116] = 0; - sha_info['data'][117] = 0; - sha_info['data'][118] = 0; - sha_info['data'][119] = 0; - - sha_info['data'][120] = (hi_bit_count >> 24) & 0xff - sha_info['data'][121] = (hi_bit_count >> 16) & 0xff - sha_info['data'][122] = (hi_bit_count >> 8) & 0xff - sha_info['data'][123] = (hi_bit_count >> 0) & 0xff - sha_info['data'][124] = (lo_bit_count >> 24) & 0xff - sha_info['data'][125] = (lo_bit_count >> 16) & 0xff - sha_info['data'][126] = (lo_bit_count >> 8) & 0xff - sha_info['data'][127] = (lo_bit_count >> 0) & 0xff - - sha_transform(sha_info) - - dig = [] - for i in sha_info['digest']: - dig.extend([ ((i>>56) & 0xff), ((i>>48) & 0xff), ((i>>40) & 0xff), ((i>>32) & 0xff), ((i>>24) & 0xff), ((i>>16) & 0xff), ((i>>8) & 0xff), (i & 0xff) ]) - return ''.join([chr(i) for i in dig]) - -class sha512(object): - digest_size = digestsize = SHA_DIGESTSIZE - block_size = SHA_BLOCKSIZE - - def __init__(self, s=None): - self._sha = sha_init() - if s: - sha_update(self._sha, getbuf(s)) - - def update(self, s): - sha_update(self._sha, getbuf(s)) - - def digest(self): - return sha_final(self._sha.copy())[:self._sha['digestsize']] - - def hexdigest(self): - return ''.join(['%.2x' % ord(i) for i in self.digest()]) - - def copy(self): - new = sha512.__new__(sha512) - new._sha = self._sha.copy() - return new - -class sha384(sha512): - digest_size = digestsize = 48 - - def __init__(self, s=None): - self._sha = sha384_init() - if s: - sha_update(self._sha, getbuf(s)) - - def copy(self): - new = sha384.__new__(sha384) - new._sha = self._sha.copy() - return new - -if __name__ == "__main__": - a_str = "just a test string" - - assert sha512().hexdigest() == "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e" - assert sha512(a_str).hexdigest() == "68be4c6664af867dd1d01c8d77e963d87d77b702400c8fabae355a41b8927a5a5533a7f1c28509bbd65c5f3ac716f33be271fbda0ca018b71a84708c9fae8a53" - assert sha512(a_str*7).hexdigest() == "3233acdbfcfff9bff9fc72401d31dbffa62bd24e9ec846f0578d647da73258d9f0879f7fde01fe2cc6516af3f343807fdef79e23d696c923d79931db46bf1819" - - s = sha512(a_str) - s.update(a_str) - assert s.hexdigest() == "341aeb668730bbb48127d5531115f3c39d12cb9586a6ca770898398aff2411087cfe0b570689adf328cddeb1f00803acce6737a19f310b53bbdb0320828f75bb" diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha512.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/_backport/hashlib/_sha512.pyc deleted file mode 100644 index 8eca4a1b00cfb78e71d549608643eed79ea1ca13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19417 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 Dau&m8 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/archive_util.py b/PythonEnv/2.7/Lib/site-packages/setuptools/archive_util.py deleted file mode 100644 index 1109f3467..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/archive_util.py +++ /dev/null @@ -1,210 +0,0 @@ -"""Utilities for extracting common archive formats""" - - -__all__ = [ - "unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter", - "UnrecognizedFormat", "extraction_drivers", "unpack_directory", -] - -import zipfile, tarfile, os, shutil, posixpath -from pkg_resources import ensure_directory -from distutils.errors import DistutilsError - -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: - name = src+f - target = os.path.join(dst,f) - target = progress_filter(src+f, target) - if not target: - continue # skip non-files - 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,)) - - z = zipfile.ZipFile(filename) - try: - 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) - f = open(target,'wb') - try: - f.write(data) - finally: - f.close() - del data - unix_attributes = info.external_attr >> 16 - if unix_attributes: - os.chmod(target, unix_attributes) - finally: - z.close() - - -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,) - ) - try: - tarobj.chown = lambda *args: None # don't do any chowning! - 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(): - linkpath = posixpath.join(posixpath.dirname(member.name), 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: - tarobj._extract_member(member, final_dst) # XXX Ugh - except tarfile.ExtractError: - pass # chown/chmod/mkfifo/mknode/makedev failed - return True - finally: - tarobj.close() - -extraction_drivers = unpack_directory, unpack_zipfile, unpack_tarfile diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/archive_util.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/archive_util.pyc deleted file mode 100644 index 1fc4d98991efb695cd0b567bf8bd54e6cdcf9da6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6449 zcmc&&ZEqY`6+U;@ubXvj$7w=asSIsHHpOvJB`6A^6zUcb5W%?B2Fuaz?9Qxr?A@95 z+`F~cTJwQK;sg8%zMu-JQa@Gw5AcbffcOQ#H;~|Y&dk1$rk_xQlbOA9-_E(`p65B| z-tynqDy`dp{drr8zh(Tsg~$E{uTW$kZzEwz!m@-55-v)(B;m3gF3UdZS0r4OUP<=R zAupF@A3gK(g6v~RUS5=ajLpkSvX4nnu1IfL`YW=(B8K0Wq_-;litJbLy(m#dIuKHo z$0CnJezAW^!Zm*ES0$=aba+`FL;7X?T$jg2_Sdz%q2&!NZ)$l{A~d09Q#w%c3Wx92 zu5hh)@Ot0Hz1YQ(^*U+hMQ1Jx+AdBGy>{B~r->J2?QZ-*#MXY`th<ac!(<S&j~hkP zeARh8=)}EfzRCsJv?`1`!La8VsBlr{sKon87PZsEBtDPAcU6W~PZUX$Mwmf<X5Ge2 zau{QfOS4h@Z~Wb_88m5ol-OYwHKy%(3w7R&ts7#k_MI$Cv+2Hb<oEGd_K9F&*d6bZ z_<K6mzJmI<(_t@6ZaQzOs^_}V)HH51h-zi@b1Qf?8cEQP8Vy&`kA4~sd;Fw_H5y^s zZZv8r%IsxZ_zdqJ9LBCYY#r3&<a@nN7KL-AR-7E{My=uD!Oupnn<noh9~`{C^TxqX z;?{wUU38lp5*$YMz(#I3aB14J2gUw0xa^(5$X|e%H9WS2*OF=ThYxM=HXh3kV*~GC zjeQHR_pr=j)4V~J9%hlXck<oy+Ci_^g4l1vEN+-3)_X4-s-t*l@wn+WUnGS%8pvjC z{SB>q_RFUN^dViol-gYFA|7sxE+3eevppG?Wl$9dmwEUNxmb|VRT(eHSWPo7$)mEE zdU913oRQ;-WZw~E%*mSI{{v9Q9)9a+0(D@>wMRyNg%2844e&cieP7|@HEALGO4D<x z*DO4qzT4dPfW<6`ZR9nZpG8QsS*dvVYfiSL094b9trvKmVFCyPyDm5;lHF+vUp*Z5 zqr};}=wQ=f){eYE;JP|boB)kU(4!vnj$ONX=jLr24T3CiQFv?H3zCrYb7x1^MSY#Z zJMBhU<i$?sI*qaSt!Tm|QMluI^rDHkc>SRzkmxZgEQ~DB98Lzzw5pwU<965U2P4i$ zy)2C71y;*x!Ub51k#PdmNM1d)*L^fK)u#419;i~T8#q;)-KOO5q-O1a8VxPQ4LLE) zkwt?va~_S^jdZSw&Aqgvip-b__Oae+g!NO$lmcN_?F5MS?PQ6VIn8vgVA3I;Q7=Ss zW9&|`#|8btC*qE0hl4>cj>7HSj8HW2k~Fy;^#^X`+2~{#CD>W0HgN)I1X`JDuO_td zVG>{i3S+`)CcV8{KTco)TDv)sJarzJSuLrasS9|zcT!W#F!I6_+BwylR-BlMKB>f# zD-wmdF^Wh-IxV(lUIn;7hLvNtXX_j$pf+p{ypQo~2=}CdI$f9|rcrv1BkXNN=2uV2 z$C0H17$G|A25?HuUBl$L*R=ziZ};b|(B|`ox1j2eI^HN9&abvNBFtvnk!zF(G8!@R z^0;u*0^k#~%wiqfx1A=|1&PD<<$$6`Zs*$RZ2c$z<?4Pkn?*z}!Y_sssnhBr1fzN~ znVJ$FMYk^Om1bd-?da6^?N>mB_hGwW7V?1nxedDO-LN(Cx=#w#&{AVbL*Rti+$Ge^ z@tRx5_XIzaB!Kig3GqwQ^0N;Q5G}9av5XONean>1RkLQ6ODm<aX_ryQ*f|XrKR}E` zj5soKq)h+F2%;UL8@L|CkNmCR{zN3s!-0{GcKzl>S<V&>M{8Wc(A|gskb^R#&BdZz zEHMTl<~)B;l8a@zSdp_`884#OJ-Jww@v@9p<vKFc>xBl3GG1Zbqmqg!Pc%b4BxwD; zlM|_*{YJ)1nC6jORCJn(T)((9*Bi4`ILk#<5b7uhJ;v2ZRaNZ2<m6MqnjDlwy%Ajp ztdPsfM^^;t&XG=*4>tUU=8&qB8B9_?`LWcITkomk*k8lCFXy50W%%8crMJPw8pS37 zK%-SB0L_7BnY0#uX>-E#88!*4r^QV&(_GvIYmg!4q^bYg=b+0COHz5F8TQ7~nI7G_ zUt@yjh=J5PCKIG>M-apo+AAis{xs+vYvCx36Q3Rg<H6CoOw1H8?Q}3AXr>>4zN^vS zeCDM-apTi3b$SgCI$;Yer3J{d+NQDDud+XftE!>CJKB-?hDrw~97g|#EQ~AP!((5@ zOBSz~Yo#soWwQaO-NjQe&zUW=gnuk;<iMk$Iqq#d_FxJ;z>KK7!A*Dy>WB@%NIL;> z=hw{Hx&g2Nx<^dzi~-z$4|py>2Y4OfaEAO2Q||KE$C~A$=6Ff63pv?U&tIV{AHkJ@ z^tnF2HHuuo2D2?GWPp(+v7ZzJ*%>D}6_Nc}959A%Kv442xesc%R_KLB;2)<cbOcfe z%oRD`B-)SG2~Uo$<HX2{4KB<4a#<d5QJXxlewS>qD%mc1`REF#$=SeQDfnO4u@IP# zeSn$vYIIQhH@u2G6+vYlGf(EK{{!lZaOKqi<S;_6gyf@023jK^xM<&rZKEjGZZ(^X zxO-7F3vUJf*_QJGLjBpG7a+$$7OaRaa<$JU%#*x04}A72mOT%AuAPwb*`No9ogIbz zY3qJWK-RYK(z9Kmp&t8Y3g;|9lkUfZcP9{!lTO;hfmG40BLMi!S*B_VV~Z@$`J^HL z8eh*-$_idl5^ArUM#wr@6od-xbb$Px^mCda-PBUMmx3Tj1c<_#;x_{4vb?Q}6ht}f zNsb}Co$Hj;(|-k@{;PQ9OcS`kCw4WM50m&zr;J-eH#zR1QJ&SAmbwDsVqd4!m37d` zIwJR$SuMY6mP#*~btRMa(ptG<uHdU|HcJ(=0IFFsFP1c}uVN%K6{VLyV#d){5fZ25 zQBQ8-zz0Gp>6z~y&wNjd^+q0?j}0LH7;2TJu^?v=IcN9b!>6%LnE<Y4djxkuC0cd7 zET|-ApCB4-&57o0Op*Y|j{)#k3^9+;3QPP+$zzS>qW&^jgdOtAO@qAyfAPIBV;a(l z<{PXB$0)mCAc8$P3G9*AEXc`+QlH8GSY>ai>>q0Rs>(+FJQpGxSdr`_L#ldC*LIDo z&&I3)@pzy%h~jA*(ymi4G(aO$Kly`E<9|tw|9jZppz6WNN9N>XbFwG+Uw6;TULDrp z;1?+0Jiu4MX8*+Q7HkHb-NCbSc&<OK^Vh#1a)S^u$LEq;(Y{02e$lkXi@teU!`<G1 zS2=nT^>AG<`-WP|cx?>Pn;{~sj>nR0LIiKU9V+hJSjY2re$U1)5NdJjgO6uL14@ne zdO^Px25){sxfDK6+QmiTi>Ow%F0AkGu!6+;UXba{U{2Vi(RMdIO>*|*xxoJ#U;j<X z{u`)MHjQmBIW9_e)YmC{adNEr771pM+W1T}L<R%oYuZA|32r^LfoV<yNm)PYw{Sbk zj3>4leXgVEZ{wBUqD2EG-^S!<RSaO(_fCF+t4mS7=AE4Xb+pu|#gkM|88AiKI#O}@ zM7m~;N^p{1+;8BzZn_}Vlv8zL+!(Rx*&o%IbAO1(ehV*ICf#rFxQ2sT6~w+;x?x@_ z-!!ZEdI_YzReDv!z!kLdP`6<=%}Pllw@=<zhiEi#9nfg_Uqyv~moMGw7g%}=FO8yu z<HH7Uqt|CP55Y_V!pYt8j$ScXpWCXA<d<2Zm-u+Zr@eh5%I6yN>^w7{mYz}I%n_4c iLcB?ZELXa;P&Mo2d$7<(=~{X91=zDzy;a?=zV;tzM28sw diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/cli-32.exe b/PythonEnv/2.7/Lib/site-packages/setuptools/cli-32.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/PythonEnv/2.7/Lib/site-packages/setuptools/cli-64.exe b/PythonEnv/2.7/Lib/site-packages/setuptools/cli-64.exe deleted file mode 100644 index 675e6bf3743f3d3011c238657e7128ee9960ef7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74752 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 &sjKl@1{;unAiW2w^OujNoW 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 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/cli-arm-32.exe b/PythonEnv/2.7/Lib/site-packages/setuptools/cli-arm-32.exe deleted file mode 100644 index 2f40402d4370fd0b032331896762593dd75b5ae0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69120 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 J|K&OGe*tckh(rJY diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/cli.exe b/PythonEnv/2.7/Lib/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/PythonEnv/2.7/Lib/site-packages/setuptools/command/__init__.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/__init__.py deleted file mode 100644 index b063fa192..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/__init__.py +++ /dev/null @@ -1,21 +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', 'upload', 'install_egg_info', 'install_scripts', - 'register', 'bdist_wininst', 'upload_docs', -] - -from setuptools.command import install_scripts -import sys - -if sys.version>='2.5': - # In Python 2.5 and above, distutils includes its own upload command - __all__.remove('upload') - -from distutils.command.bdist import bdist - -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/PythonEnv/2.7/Lib/site-packages/setuptools/command/__init__.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/__init__.pyc deleted file mode 100644 index c9fb4f9e0a2e4a572c0a8d74cdb68eb371bef7ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 959 zcmZuvO>fgc5FOiX-LEuhOGv3e>M@t*P^m&f6#@xv2thd@rIuE9X5((M_FCR?AU7m_ z7-#+m|9~F=v+I-wft^hDy`6dUcCyjW&Te-8<NX9yPoIBZ@YjClfcyynL%;}d18@^? z3or)U2HXMM1>6JN2kZbI0CoX;fQNubfX9FjAn(JN75ab=K?hKTFb*MbcmO(raRf4g z8S9?Fd=u&~AOU9FqYGaH2+Fqf5$G)_Vi?C<dI~az**45$sJ{U|_K=;N!d1I5V^61d z<u@_hu<-$W7(U_C&?bjetJKmCuQF7Ygv|3bR98id8l_Rl&qUiU)1zuhF$0tfsZB-u zyq2k53RPN4wf32;#&~Lc=H12~XRg*ltBkf7*M?G(zQ(2t$$Hk?v(A*yu#%Xi4NfMx z;+jgE6sfl+_@`rcjkJ?mIYno_mN`qxnmP>HGk;R0^Fz*9D=E-Stop^zFktffki%OW zal9B^ddj==<>Y8?Yn_dEOS(1X*@*GkRB1U3nY4e6_y2jWx1W*_JUk)j$Q4RzDl$gf z(Zm!*TB3L2JKCl7`3qTFWy*GnvM>ut11@!QYe?N!j=b4xcc014W@_ppC9%@Abnp-7 zCDW>sB@THL?t`5&#Aiva=(fp{kE(pBr?tejRi?`1mCTwvX-D$9TqGBxr^y?YC03C< zuhPjp&81E551FjYB!VxEA|Xb6$J~E*RTylveC~&N!o*SF-fq+j_QP)2<F^}hg5&Tv D6It=q diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/alias.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/alias.py deleted file mode 100644 index 52384e1a2..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/alias.py +++ /dev/null @@ -1,82 +0,0 @@ -import distutils, os -from setuptools import Command -from distutils.util import convert_path -from distutils import log -from distutils.errors import * -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/PythonEnv/2.7/Lib/site-packages/setuptools/command/alias.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/alias.pyc deleted file mode 100644 index e7e37e67075ae1d05fdb2c3ad50a635a71e74444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3504 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 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_egg.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_egg.py deleted file mode 100644 index c57761582..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_egg.py +++ /dev/null @@ -1,553 +0,0 @@ -"""setuptools.command.bdist_egg - -Build .egg distributions""" - -# This module should be kept compatible with Python 2.3 -import sys, os, marshal -from setuptools import Command -from distutils.dir_util import remove_tree, mkpath -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) - -from distutils import log -from distutils.errors import DistutilsSetupError -from pkg_resources import get_build_platform, Distribution, ensure_directory -from pkg_resources import EntryPoint -from types import CodeType -from setuptools.compat import basestring, next -from setuptools.extension import Library - -def strip_module(filename): - if '.' in filename: - filename = os.path.splitext(filename)[0] - if filename.endswith('module'): - filename = filename[:-6] - return filename - -def write_stub(resource, pyfile): - f = open(pyfile,'w') - f.write('\n'.join([ - "def __bootstrap__():", - " global __bootstrap__, __loader__, __file__", - " import sys, pkg_resources, imp", - " __file__ = pkg_resources.resource_filename(__name__,%r)" - % resource, - " __loader__ = None; del __bootstrap__, __loader__", - " imp.load_dynamic(__name__,__file__)", - "__bootstrap__()", - "" # terminal \n - ])) - f.close() - -# stub __init__.py for packages distributed without one -NS_PKG_STUB = '__import__("pkg_resources").declare_namespace(__name__)' - -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,'/') - - to_compile.extend(self.make_init_files()) - 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: - if name.endswith('.py'): - path = os.path.join(base,name) - log.debug("Deleting %s", path) - os.unlink(path) - - 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 make_init_files(self): - """Create missing package __init__ files""" - init_files = [] - for base,dirs,files in walk_egg(self.bdist_dir): - if base==self.bdist_dir: - # don't put an __init__ in the root - continue - for name in files: - if name.endswith('.py'): - if '__init__.py' not in files: - pkg = base[len(self.bdist_dir)+1:].replace(os.sep,'.') - if self.distribution.has_contents_for(pkg): - log.warn("Creating missing __init__.py for %s",pkg) - filename = os.path.join(base,'__init__.py') - if not self.dry_run: - f = open(filename,'w'); f.write(NS_PKG_STUB) - f.close() - init_files.append(filename) - break - else: - # not a package, don't traverse to subdirectories - dirs[:] = [] - - return init_files - - 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 os.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 = os.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 sys.version_info < (3, 3): - skip = 8 # skip magic & date - else: - skip = 12 # skip magic & 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 - if '__name__' in symbols and '__main__' in symbols and '.' not in module: - if sys.version[:3]=="2.4": # -m works w/zipfiles in 2.5 - log.warn("%s: top-level module may be 'python -m' script", module) - 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,basestring): - 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=None, - 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) - - if compress is None: - compress = (sys.version>="2.4") # avoid 2.3 zipimport bug when 64 bits - - compression = [zipfile.ZIP_STORED, zipfile.ZIP_DEFLATED][bool(compress)] - if not dry_run: - z = zipfile.ZipFile(zip_filename, mode, compression=compression) - for dirname, dirs, files in os.walk(base_dir): - visit(z, dirname, files) - z.close() - else: - for dirname, dirs, files in os.walk(base_dir): - visit(None, dirname, files) - return zip_filename -# diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_egg.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_egg.pyc deleted file mode 100644 index a12c694af870f678b190e68911655a93b7dc07b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19633 zcmc&+TWlQHc|NmCQCx}?DN>?D>o%e;T*@ZpTb)#P8q1<=t9EF6D4RATWxU)OQcLcQ zbA}RWOGO%`xyMZ}$U{-IeMnFgeF##ZZTb=<P1Ce!pYsx=PSN%$NZX*uLkk4y_kCw( zm$Z{!@*qjv!#QWp{rs2j|IfcH{>Nbd()2&SR5jVZUHJVZKK6T_F_AHgNIer3Ox-h! zcyP}JvslQVi)OK?=c1|in8q%%xXXB~*JJ9vrm@>B?lz4+v)E_6t&^&_%hXGz(Qg*} zO=FK)+=J@9=A#&Ez$`Q$G(GX4S?f2+7meqsqur*y*EELA;!vl4Usk{AnO8Yh$<&8U zW1m^v=f>_g^%2t;HH)JzzsJ<~o5lgNc)&Eq%;K1795jmu-Maz3J7g9Qx%{B1kDJDQ zX7N6k-)riJP2-4JJYpJ0&Eip4I%Mj{Oyjs&JdXUZrsJDvpB_$_Xv8c|m}u0*yUa4? zx1Z&AjCpPGq=`?N)zc<AU{=qt=ngh^(nMowSvJu@JxrPCkRHyO8n$}e#P^%WqWetz zfO%|j+C+!-a>hhQ^l;8ZNA>WaiH@1*xQQ^C6K18yEIwo+%w)pE51R=4f69Cmg^%z^ z=gX&g(vLBT(~Wl8YSrybwbf`;n$gTsRI_OqudMX<KebV-NB#_+eHJFQrH!=KYTDXQ z@NcdRN-^nfBo|%Na)AYVkR)-Vbt4YbB#zTw<Qr@4N_ySB??ZkiPD7TYBY9>kz20hu zH{!%%fDTo%!;ARXek7?#65BSfj^;FUdn1YKwI$6ZD56#wpKXa<K{h&nb)}YG-&nf3 zP-|YOFDG%d?P;mjygC~%ZLC~<QM0(zym9s6nfF|MzP5DL*3x*oU8$~BR$_a#yIWVY z-MZS@t(o>#I)Jf4t<BAfdCN5z&#iqg9`)WW7ZVS9Q1mm`n|dUZd97|vT?E|kl-&As zrEcSUxY~dRJB&}hLXiWHpx#<>v@wdzEC>fwQ@8UZwM$9TO3JL%Ir=3MS=g>u(&bjt z&>pf)PHZWMh?^EW8b-AwuBNSI%XLqpxYSIOtruIhX6njFT^CzXd}XU0yFF*ErHYN& zWpgFvemCRItU7lS=bTiMtt#iwPlxC(Ap;?E%b2xZlbj|2u6ky*z!Dq_IBEPgIy20# zLKYTTnp|Ku>M?%j-F%tnHHX7AW~PS3IHqVt8}+#MU*M%OXO(i`memZ!99)ZS*Fl1t zY06C8jO<Mia(AiAwR+sFG`7*fT_<?%YddUcF^4&0Zn*IVym4>H8}zDN6%U-n7xA$# zAi-AN!VZGG3+6U9w7{LkhGKKEjo7_tmw|G?PL4&pP1Hw8AN8A+K5j97Jhs4oW1z@@ zK`3<G2H&*Y=6<^$X%sK}VYt+4rI=);9fswp^L839eBWQGx0WjPov$B2w%)2laT11n z=I(}}J>go^8tqn+`gY4c;J4RS!X&n>jieeQi&yr%tChF%-?y{UOkQ2R>deBBzcAG4 zWXe90H_s=44(3|T_;Ejq|A%SXGo8uJuw@u+q0?Hm-03`@(3BlQ)pu+M&H>U=)W@XN zj++uLHxp2uC~=j%Mf$DQTaY(mUD9H{9FcN+i(4fEUoPXN6To+s6iHs1bqIO0G=ZEw z#F>By2fSkTzbE@WSg`NGyD)TT3c{G!aiSAbGf`ZvS0HnEL>3w#?(FDPT0+~7;IDEN z{^PDZg^&Fzk{GZC6pa)V4b7ZWbS$DBTLzK)8Bs@jOf+B)vgiaA_DV0I6bXLVfcRGc zw0a3FK8nu33!{1fM+jRiqS^tK^ygRt-8n2VkYkBK0tq(XYXBwqFq9(+4B?Q(z8p!6 zm|(tqlIu8vq?*K)H1;b^e*!RIVkZueXeBb3hGc%9j(^EMgjQ)xUV%_W{Y+&0knX;E zgB14D>+!q0q7Inme!H&P_HlHTD+Zr0{IuoAjios9YfXP8ZpH~F7x}pqw0;>ZU)iXq z=l#=mN-`kctkyT8c-rymG^<*BKRR|8#jn)sK6JPGu>Nw=YG`uZ&arIE17C~d_B0o! zb*|ZSS(&Q0ZM+e+rfW@`qQeSNl27#GSCZC7Gx96TX`J|yBtLTxP`7%$b|cnkJ9jmb z)avdfwxPX|V$My7Fe=b==Wb$qB!=x;tvxLTYahmRne`Ju9cWyhLJYhGB*Mosk0*ta zMCM#XG_-=JsVapjKa}DZ*##4jH6(K=`sM>jTxv1|3A<MycUJ;Jb|oNT_W%;6#Ab(c zQif$Rj${qx-8SaJdX*yyh!2(HIfOa~w&Ok#7o?;`t}oQ;l*P$~t&J2rl~NmIln^>f zkQla3llHJ}T)$VMiy*kxtfjR|z4k^Nw%P*O*ElHxM&p&X{nv?b!d$&h<i~ixDXd~M zq#Ju~yRAo>qZOPGYv_2^`b_enyg`A=bafYXFa-JPZnN4)WlSieCOFXy-$2fQ2hjGG z!RFp^XIaYMLgt`VFI#yW38Kf<{!f!a`Z$uoNP9J>Ap=zBx>((3R!8{U`a8|3WbR-d zds%Y3xNT18bJX0z0(O~$+0+I&IJ%xM6UEIrgoGonHJ4k`SQ61`5idar!3=)e9wfA9 zM1FQV0qw|?NiXREBt+|CGn`BmW~g5}FRq2vMie}XN&)3baF%U4A~7W94A@05#^gAY z2bd76sBf4PA%sJW{?T`K?7@SqL(8GFAWA-&RV3)lM3UVguuKl<fMu%q>lGUUF=mj= zYT;7x0cAk&UM9bo_s?0f|1t{hfz~Ft&$l<<0a|R*J;odJ1`0#oh<6z2P+_<*R4gLb z>zycy4QPSzbCE4xhnR9~z!b7c%mB&<1+4av$g_uD8m*u&P(FSfvw-YZO9mqsh(^)A z&x9qj`L|?-*=t`HE%uZCa1J29q{qYFBa03|_-n4jjWZ}REt+w>V?9?2EDPdwrMG+X zsq8YhdNc_<;KyT6_Pcy`oWjOKAb9lTd8o=kHS4Iy96Zh*d(8MUAav2Jd)|7FmockW zvpSs3&|81SEWGiMNyTg6Ah%6p=vK@+O3o$BMt{H++?j&6fZterXD?nAr%@3)!#h)T za8f{c;bUr46ZR;doED^7$xLTIs-zVv@6%Q^o7D(eELMf~sXDxw0IiqBHexEmG|_(E zgf?@BtHdHrn2lACu`+-wbsA5yPJ{QcHCd7aIf<`q&8oX5#w4_bVG8t0K>=$@B{f@F zvZ@M&o}{w6RKdn=aet)^s2l~{52-E*9dd0I`ahQw5(#Bes8|n@5IY254c~|JD5%R; zJ#t+@sRhrlL(Z71l0Jy;5o=PEL@h{DK^h&^$2fl<i76Z?obbjAgWd`7=ool%#2YS5 z77iAQ-hS_Bp_;=6{uXy~NsjDRx(*G#mAsQ0)*juX#Zo3y)H}Ff{{Y#{tx+X`lSrsK zo@03f$>s@~u(Q|3$$GR!p=|L0!2yj59k{;REVyEagJ`Q#HRg6MYl8DLZ7J5ryU#)# z^{5w!3-LLbeqKhGrQE*UywO^V0pYrEA@Vb&<i8GeL{a{_PalE57H{2bC4ipEiVX-> z<u8kptuWbWN@b=8+2!2)l?%^5AI@G5E?vCxLhxF6;mVa@-qC)XW_a3ZIQ9~}%C4v% zx6dM{c<24wXy$o&J{<8=NoO;Zr(^A=n@}y0ek1qc^}RX&;3bUy1$-Rf0$m^UM)7}y z4h&N1K72^RqUG;lu8x+Sj`3g-&~cH2td3v>3dXrR9h1W>idD~qP6!Kc-N9C_sl$>P z$ezG@QVh93hjAx|2&D8K&vP`_?FKr@n5$3&J?8c<YB9_%9N@$4UbFc%LNKTlOl0=j zpQzq$bGy%^d#PNgCFE6M`;xicpO^2`l%VlO%q^fYD7rpDuiJa{VnBclBSVQ~>o2jV z&f@pOR`7sxvSG%uVQxu*YFz+&z;vz)v|K%?x`*iK0cTJl?lw=X|2a4bHODpTeOxJr zL{aj24?MSe*x;E(neM}$9x=(6q}h(Ldj6tlZV%+M!Quc>HI>`g9B|_?b8FD`j12lX zZjy2#n>%U)#13#)xA&TCwP?1tyILF&jO!tm(QMy`t_u0Ue%|$t?tpsH9a{95<j)FO zr`V67Zl~D79~IIQEYmhm@CkN58{*i8&FV?rCt!Y}7Hv#knrBXF57vKFXudyR{pqa7 z1id@b#p%3jT#(0^d}uZY+fU{_Y}-F>URlQiX_l>UYFj<LK1+`TCXFd2&lNf3{d7%m zhS{M#V3JCaJx%8)md@x{&gr1s;p2|uJ{9h#_ky(_a^n_t*bf`~<zo7XUI5ADRlzSD zC4E#cfO3wIG46nJfP0Rb^cUC%J3D9Kg5jKmbdG`B=Y;OxiD`g9<l3mh&FnBuZ~>Ji zF=c#)Rf3dDEbBvZvywDvq6#J1B1+(IuymDnTmf`h`OfhtKM7zGrOr7SC6}IgX8Q8n z(=SL|+A6%Qsg-XlQ_aL#S#bujsJe5#oxRzCp=d8tr8Qe&+;+H)O`7mq;MN9{w=?Nx zDh~o(Y8(JFq9VMRX6{ugOnFe;OUrx|6BD_%o5(L*2<9%&J#*fl-1cS?+6gX~W-IlV zVt>QJeY3RXcW+kw2WK8T(f_i=*1|`WuOf-pH{eOK=U~_*uy3-wYge9<l2hfl63u9% zU?(lXVd>NrbvHcJvCc>?1Nni1(<m?V9xS-ZglH~!k;(l`h&_W@CTE!lOmd%SU{$$I zAcI=$l&dsI%D03OG`}(^p^fJGT6r(x=0-zat1gHQsD_<=cpsl$U_vb$oMQ5RBwA4t z!x2)AgE<xuRALnDw+3xg)?z@l8jV#rxCFA7wtzGN4%#RQo@H0BFyS!<AaUB@Ai-99 zD};Gj5kgK|0WoSo6d#ZS0w0M6t6BD}$Bkya)?9-%(eb!emg96QT&`DEMDcIH4P#m6 zW(fn;ijxF$$qs>>gru1_;FfpZV>f9n1noJPGlj`EIyboF!s|HSI0@*(56B_f80>f@ zO%s{KWzMP#I7mN06`B=rc1Y_Yc%2P7IH7ueOw4aTHfsB{)!DyEX35R0L%<S@vxMA? zl3;=v!vD;N=LVv0zyT?7t^8CRXB(r5D9CX-xO;<sv<iU2FJWqyjB5&m#r<%cmrMz_ zIK$onuT&U;52_crL*4{R_91r!;OJ;!6s5y(u@4qYs5gkG19*D`5b6NluwFlU8pE4m zz$xZOVI&+cp2FMyo)X#}!dr|}Jm8=fX@<h-B0lz$NC31u=DfGL!Fw`_Ysu=_YmvDM z#SV-Gome!R0de^3wO<yHhSd)U=Jd`Zyfs~wj|;$w`VtM`6F^U}d4b&lkf^{=2{=Y* z$y<NK;Adg|sG&7HFDJ^JoW}t#xGDPH={kP5<GUmAdGfO{c*u#&GAXPpaxzs>U*pxg zlRt-8p=0YxLP(m(JsaG>+ikXG53+RTh{qt{t*Sa{z;~kAF}A_y?t6NIH!-RQmd#w6 zgWhqF#1M#N*d05?66dL7m+o|0S&kg+J`^@xHORuTSmJdop65Zjog?PikuY>^2ndJc zbf(i>K%%zf##}P_lvPqf*s;fPy-}%ey}@(I_!mZ16T&sMGcz;tPY1t()=~jZ8Aw&U zfifpZ)IRPW9RP=M_x1F-=}agP@6q0K`Tg8`lAOVw4|qM;{VF9W7t&$3!ziKE;F-<6 z9$16hDLZub+K<I&VlvvOjtAwiO3s`0G5TURzfHcHz4k3K7FdWjky_(UoW@a)S=&vQ z7#ic;I(>ur4j#uTlJ($+a-5kTBK^^V_jIL|%&H6_mSnuThrVWXNG`|ZcB|V#V}D2l z3j4wNq+#vQz;J$NS`WwoqGz@N@F;8?T2?UJ<wJXM{er>I0`>ypq>SY)klJK5TY`p* z?pmx-v+yK!-CVd(qz(?<ZPE_T&tE}c2yq1rj<6^5zSv9N+qSA18VraQ%WM&Rn#ui4 zBp#mQQ=5qd1+jqxDpc+QDj6Y%aIraQL#o~8lYW)ij=~o?&&`J~KKD#Gf92(;1ONm{ z$|8A@Gs&n6HiFNxhqsvgI+M>KkxIdps<dRlRo)}gPcZa8lKvSym_jea&Ja?Ho&oO+ z-Bw_Sk~d@qQ8w!J756yj6_-d&Byn^C9XKsSqE+NU`#?t9PAEAcRD+np+m6`}ng?aN zi;$;D+4IPQ#s}<cavFgfT0|9e$rczdM&tP-9(gIF^<Lv=4yHZSXfXdBxuX+QC7Y>3 znC9a!^<n43ZwxZ$G;za%8sLBu9lxOUF>(Q3jKE9lrK5T6{oUFyyj=y_OfcPDHyKAl zD}w)WGu~qcMxA3JSkm)l!k@X|2vSQ#+lBNq8H(4ns8AAAoQ<m+X=Mp0kF;%{L9)Hn zhw#PqahuTxei;E0eznr1(Qv(TBlahOxnKrN`na@A;$>W|!na)UT@XsGh`z*LI1hCF zEKcv_iE{|^I%lu<*OvVc`ma+{QX~4O9()~v789q-dC8QW@UQj5_GtR?W?c0V)`iHl z)8+OSEQ%@XPgnhk?U5iY`#3{FX6SV0LgOSYKlp&(%1Yoy=9}{5sRt*grXF_}%;;@x z1$|}xxWT8gj^fQ)T0UJ~-l*57Y<X&G!k;+x<V1grXs>?XkE_>Pn6zKB(q6QYs;z`~ z?CyeG*SOd57Mm$4G?O=au^wa5*e<QR2J;I}Xc>&#)(%Y=;o^GBudGyRO||7FEHl=u zf4SE0%qeWBsgxyu_To_(wp~eV95yO#Cw@o_I>Jy#XeAH;)TKQIO$ga-ZpYv-1G1c| zVLNjZj?sV;N$zMJ^43*a7Z=e$lBuB1>MeNSt+StG>V$mVk#CY`4thzHkyhe%L&hy! z`_zOw>EQEtlHTS)I1wjHj6xx^LQdlG9*MQv82T*5+F3jp?=b#Drvr>L(q*_f2$4qL z<$+>xpubQ8WM?i5#^MS(qV2bkaiR@!jr{H$meA06hGLYerxthcdP#M1AU%8Sr5tBN zw5TP(K)0oEHmJkBI?g_TxFKX5yykFlCSnMOz1IOG&I4-axJ`?@2m{s64OG8OvgTdO z6e*X~kLwv)+(5h%J#!L6UDPaC&ASv`3O$O|I!pV#Tz4N5BIG(ORHwT>zzWi-w1Y+1 zvXEJ88`u`9b_UkH4#yz=bJx$@-!>#uZBv?7l<8)Aj|c{bV&+LOWLVR409tPhI`BBG zvnttn4?er`xrmSb6iOTnWLn_WUUrRP%wx2&zK}UVd4lrC&R+YR@Sz;gbUHsv*fx9Z zNopWE{DjjT#=`lI<2LpV_P1A&m6r(R0oXw%Ack?&;*F=be#zixVG|y`UFhn5p}TIC z2(S??vd%$&pd*3)C)Pg)o9!GR8)hfSh@p}X%SVVf1$j!L3O9dOm~a4HzeUeCo#aRn zdVt&9UT^*Tifs^Tq^@)76tpYocndCSY1eG{96!>hDB`x?&u6wje{k9th*Gme^JGgG zLRff)J-0Y2eii@#uqDI<<OLFwy@2GIIQ1(&snu^SLy|Ml2-=XOZOIQ8p|W7LP-sHA zAOZ>e;rtseJg6lWaqzQ>{zTu-Wr>D@t5JP=+wCibtc2jrN`1{?Myhs+$$IN1bRFF- za~G~$e&tel>D4Qj=H@TIFgNd9SjX|oSxmpgCwkN54C&4>xXc$Ld_lNMKE}(C5?AJ` zkmQaxU_-s3C=SG|TX<6Vr<^{)ukyu5kT_A!op~odmE(qBHgnb@h~wATK++%^`W|s< z1M@&wm9ZMX*z5Hch9SHM@u9b6nqd$?tV8gfj37Pio$~H0xa&cRBn7-E7B4u1?9Ug9 zH|P4>j}CrX?40v|{6B){TzA~>PE1=c#o0}(C=U+=`TlPqZQX@-<J#ta&cHSqQ#$fI zP*$`VW>GU?DAW<f&V3GsQrM0|FT^%*Tqk+JiafB0G6ukE=4HVns1!WOL|)egKE1@` zQ%vX$kyj$1ff7)i2Ncl(DWFSydb*oowDO2kOX|A0x6oTO02ICW^g|-Mr`>u&R9er_ zXsN$+ymViwr?jUOluD)DrSZ~KX+VLOGZ7;zZOfmDw&38Tr!11Hp*SnzLkVQBBf-J} zH6X1iQa$<i<Tkhpmrw3+p#CXJTRh1J=o9B!&;=5Zi}V8SZ(i{>afim6P8dw`LcHRw zzq}n(Jc$t(AkG-my3u4L2Cg8WxF>DL>GOb30&CMIrwHw!4}c8!{evC%GIK7tN`RCu z)POQk8sBk=<hKAV;Q{YnxC4}^@MM3M4c=lx+gb2;DY{32i1ICbnBqqu0m6o!qG4}u zjvUFv{9MGx{s775Q`zC&VKBs_x?9$X0Z%)XpFQ9t!2dc!IP$3bplzYs)(6c3wgb&= zKxh6uSQ2*b=3CTFjv{8SeOS-}L5jVE0Gmzf%h_woyu+q8hD%5;Ui)UAbt8PytiQ>h ztd8`){YIXZmQLQJ{|@5-VW1l5=1z}keTP^AvvAE9)?+{khGFp7=5`!?$HPO<B?$bc z3ovYNRr80I@TiPl-H5nb66c&nBv8Y4p=v-?=DfUpc!IqfS|kB8Qo>h~jaX+S*N+4g zD`X<e`Deb$J^&vw+l4nWw1SqK!Ef@-PI8m0MlwdpT@^IHf$0!uTHbk?!Z=h}A1)kv zAZ)1Wj^X#Q!WsAV5n5&Zi0;0Iht0p(PIrI&Q|OLo3NqMEj5uOP80$P}=a#V_BGvKS z1-I6UCiw~l5Z#Wd?5%&rfJn0j@H-FgYyhl?5}7y@NEi<=6!#7}Q8IuBMh*zvLpLOM z44k{AuVX0|dtmyV)$(;b27k$<YuyS(i89XOh3J5)M(+Q2nzh`cKop?E{%dBx#pEQC zdvwk>G4${7oC))I&IbTpj=|M-j7~Qrc7j)an%rTjS>fcF&I_vKtHJD})Bh)Q<@5#Z zRUKMq({TVkPK{sILI6S$-Zm%`9ETJOWCXm-?!pINW=9)R5a9jfgDh!(h}OZutb34! z#0v2I_(3|?AZic<eax)Ens|$@I0&OAx`M=ljRVU7{y7B7fCQXef?#pD9^AhQ5>k{6 z3=PU71voP{l<_tS!U2+onE^7y4?=7<pI{ga{Aw!<K%HUe3L;hzEW_2oxjmxr1(d*1 zj=&VCX~blqv-KbHXCcCPuI^{N&BZJ>#RaC|n<V%S38F~wy%Bu-6p<MS#aP+%?ok%J zY!pOaymOQVZ+*d|nZhs&H_+Q2gEBhLP{^?E;Ng7R<IZ6$_%acD!B|-ox%nSuCG1!} z`M0Ic`@tY2d;2(&i`Qegscv46p^1~s!w0t@{O(KjEyfR6XmJwHG+bXK9GdDrF5H)w z^)=P5v)vg#=+ekTSnJ~xDNYhHS<28L+XMdbZKyA);u~Oeb)B~7^Wo)kj1fI*85cpb z8IHd;pn(i3m@)1v211m`!3W4r<tFI7R0-J}C4BC@z}-47@CoM;7#(Fj(L6^DhWhbV zO8SHi6ZkL{dP<Frf?5;biBYMAC95JBfSn==2!wN1*JK^Rg^DFiplsXPK5*eR7nnix zlPzoJv<<$3YT2eV;2OlH6jAc<%%gTD>mY5lr|bAiNj=}DMrDg#O*$8<Ki!zj;#71q z<_>|KlzA=rPLcOlER!du&8Imgv^|60L!$L(k??Z3ND@jo;$kM!ku>0tyk4oRkfAm5 z{3#dJa8f*9e%l9Ol37eLwkfn*jU{{;dfP<_>jl4$q)a*Fq^q<jjZ<k_cgI10VXz;G zh9G{F)K!j=LejsQST=^kdX;+>@%T+l^^Yi*X`CBez7OM0@T7MZW@QN%B)kwA!lhv^ z<n<^};3#x5zehI!&*E5t`C({mrUTA_#Dk=?uHs{FAlbxKf!sra;*iuH!1;PV96GP) z1u^<_`r-)$xo!j@2oj+C0_&ZW8GvG42PP-Y<`J6oP9*Q>@hY4>Ck=iUAphO>itJMu z|Fv3-FR#;EVCB_z-~WZQ$U=@@=c&A|SG5%0bTAzZ0R?rnmR7;ccFrMpQb4ukz6dA= zM+Vo!3~ITISHUooAtrAlk&znwBeSFsF`8<Zk#kD;uHr1t>F;^YoTe!ZBcy{4gg$&m zJsy_+@$@d@V`q_c^eYjKhnUneSrK$75fZXct~eQ}Qz}x}gIPux+r`gO)Xa(cS1UIv zB6ftu$tCe}llMNlvT^t3*mXrI<=aos6|OMyul~*0WptL^UsNnEEnt*YHgGSad!JfU z-|+J*{$zf=4?z>BinA!kh=qpYAa>?$k-jxQl{?3>IDD9Xx~&3&*O5CJ!*kE4;CxMz zNi={0-l296R8M#HRKJ1ozs*zSB#k#w;C;SA4g>C0Kn9SI%&y+_ZKN9O2E1;o(v+b* z<0<j%?Gbc_<HiZs6*UaMCSkC1+d2SMG@l?n;ASwts0V+40`CAmK5op%J$fsFmOh3K z0G@z`KrZ;g*jf&qfCpg2^~kS^KpY?@q(V5DD(Zuf#(|wMiv1V81Bj7n2CPN&RPcbF zHXqc)_G)CxkmIrr`w5x|l28>83w=9OwEm|s-r&AP1TC*BANfDD$F#S#|B?L2^9lm7 z>)562>c8TH*mT3@?)3OQQqm=LIUxzc)ci?aD$?SgobmlD9cL_V<os@Hg+oG3Qc^|R zn)vto6EhfN0&Nivi5opf$sA-N!#NY`%Kh1jT<ex`!wHV7)yZU2q<OZuj60LX%P*?s zgwH?7P)oOb*3Bp+j?@?L|CaTYRepmN4YMx*fI%1<BVY3rW^{QO5;L0+%n{y4b_RVw zJtdVIXFUsVwf_FYC0r!x&p)7bfWHNiz(>sixNf?$`J6ec^PT1Wqwl-FHliCn#Y=Re zW+zYM2AC7BMEW|b^6(?p(kf}1G*0>+C4GMq$>v9>KW4AJ!AP-=kjox`SD~Y177&3W z97SF!UVw=*6OlAXpA@hAkb}qJU?Q<Lq|X46QP<sMHNky~?I$hmasl1=N(jFd5_QZ! zAyWm;ZkxZe;=AVGA7b9_#%hC40z}97Br)_EJUJx=!ZdFLAyR1^sXZwm=e3_?#RA__ zVB}<}JuRca+)d%73Ese0u+mY?s1px%0(Rkk;Eho)N0#z%P&FX%mv<UvsxU#QjQm|J zYj?A_{BA^@3)CW96n+z=1`8mp<%QtVtfV8evzMNJ{=$_@v%%lwy)V|<PlJmCIrDs! z3i_!523DXZ_c!<fyQWZex8mH{e73<Vi~pU;zcTqZCf{eGIljdwI{dWxE>KLpy^6BC zc@_Z#tm)-3kf=;)0M3`u!U%qk6pr994&jDyzc*N5T7DEYwEbZiwW?t#HR*8scle4n zOE>BxK+gS@7yA7r0%jlzLp~{XSEnaHg$sW`q~+R*{(_I<c=i1~5x`~r*$qh!1g*GR z1lL=)8BH+t)EP=-pj)L*(M-%gK9j{6Q2FinlMl|nPjfKfyI?Q7r1(hjmt?H)oi4k& z3*=u+!quC@fAab6NA+#*I~QHL;tJ^Kav|Nn&8O2$zRTnvkZ36Vv6tY>Ec-MQ`p5!0 zPy!(j5?JtcCf{U2WET(!1g|lndq~IWXbQQzk2WP;o^Y`mza(5iJlTt2-(g%g7Yhgj wMqn_~;xI~%;KTCa0xk}QdkbSfG0z^@g)4>OQh(9g?e!N+Cy|>TL1^)R1HSvry8r+H diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_rpm.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_rpm.py deleted file mode 100644 index 8c48da355..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_rpm.py +++ /dev/null @@ -1,82 +0,0 @@ -# This is just a kludge so that bdist_rpm doesn't guess wrong about the -# distribution name and version, if the egg_info command is going to alter -# them, another kludge to allow you to build old-style non-egg RPMs, and -# finally, a kludge to track .rpm files for uploading when run on Python <2.5. - -from distutils.command.bdist_rpm import bdist_rpm as _bdist_rpm -import sys, os - -class bdist_rpm(_bdist_rpm): - - def initialize_options(self): - _bdist_rpm.initialize_options(self) - self.no_egg = None - - if sys.version<"2.5": - # Track for uploading any .rpm file(s) moved to self.dist_dir - def move_file(self, src, dst, level=1): - _bdist_rpm.move_file(self, src, dst, level) - if dst==self.dist_dir and src.endswith('.rpm'): - getattr(self.distribution,'dist_files',[]).append( - ('bdist_rpm', - src.endswith('.src.rpm') and 'any' or sys.version[:3], - os.path.join(dst, os.path.basename(src))) - ) - - def run(self): - self.run_command('egg_info') # ensure distro name is up-to-date - _bdist_rpm.run(self) - - - - - - - - - - - - - - def _make_spec_file(self): - version = self.distribution.get_version() - rpmversion = version.replace('-','_') - spec = _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 - ] - spec.insert(spec.index(line24)+1, "%define unmangled_version "+version) - return spec - - - - - - - - - - - - - - - - - - - - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_rpm.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_rpm.pyc deleted file mode 100644 index 78f8f40cb50ac6a28642e1e9f67565676e34f5a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2527 zcmc&$-EJF26h5>5N$oZyRD$p$wdNwoAgzT06;f3pN((n23)UBi$go;_$L`qc*=1)O zYHDA(Z@>lb!87p&JOF&>tm6iSYZ7H<&&-@Tzu!6I+Fyt5QTXR~W7_@I@ckUaeSs;( zzoLw2q3Apy#p{5w8lBhV40N5&>y*|=2Q*QX*6AhDmgt9bECL#I8xUju#$Q)~@-0lG z)HolP#iAc!MSIl&7Od4h#-xc@1hG7*)-{?zkD@tI8M0{Td<m->WMP!3J#SLl5dH&- z2HhshW~Dq>_7e>E4kk}DQ?!PmN_+wpi$eo3vfr&UQyWvfx7FXp(pck7l9^w1oEP5Y z)_G>_=T>`GXY*K3r<JFC;B+?W;!85QDX8?}aBBRs<!Jc5v5&J!snaXe$k^diJz7qO z->&?#+<s{<hG)G`hu@gd&>648A{oz<sdhuB{j%_Rp1I*TUn~-v4)?b9idDo8-^Ork z2dP8lIJ0NH2ZqBj=3O4_q{QWS5c{~S5uJe6HQLrmF@=ByG!Ll!jc_(YuoMRmO9X&V z8=MmOw?&?ihT0`tUDy&%Ofe^aK(kwvHmL(3%-S@&&3bn99lishTObLVks8h{0Ye9{ ztuK!BfEr1RKxkqz?F2*a7Fc?&918<`n%I@$Z}$*W#6Ao57Wsva`JU$+A|*AYEVNDC zFGvlHB${fUcwhQEJFe1<mYi@&b5ayw_AK75obX@h((y5eJ+DwvB#^~1p5?}hhEd|Q zO%_`46>()$GRm=hQ|CQzX8J;BHv}7w%Ig@89Vhjsx~JYyHFaN&uT|1LFmUP-M#-D< zK!#w2b0>-8X!NV#PN%W4lf278^9;;#Y2zJotMu>*Hl=zbI5!l6w_yi&iGAgW>kJA` z&J#ZQ15@QX`pA}OgL)C?5ed`*5WE4brDcH);n<*Jq$W-_(k+4dlTCvQ21WMt$49hj z(z?mvLn}kAKmyaKq=QQub<^6>Yt)?Z{1nj7U$byXK?(8<IXHqDZ8}L&UW!g2OyOwI z<(&4BC8AK~*d2pDP4&cB-Pu97<L+Z~kT1)z{^()n^aUe!6P~`<oo{+RDcuME&9k)V zMAJ;C@xQnQQQWZ5nK}ktGs&`!djJ{I#;)#$p))KY+zANvbFWK_3#$;a(fiVl<6e6z zSKa%2vJ=`X)?T+n8lUw4OOLPdbfncp94Emjy1=C)Qst#CvSh3)ydHroUL<oJyF!nv zrox87KV4RpY;3BZS27tp5nqw^g*LYHPdWq(kj|1J5oaI2B0rI1-o2q>;3EGJ!}0S+ z>PX$iXsdQmYkw8Ir@GuPq`>2taT3SXvl%b)beUl(?@;s_xWxI0`6I5dh$X*rN~r(! zfrNVEUn7p6z-G{@9|cFP*0KCx@$X`f9|!dO%=LC{s<(e&<;@WkRIYIu-Jma$fJarx OKVt|=>pE6%1^)m=MP2Uz diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_wininst.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_wininst.py deleted file mode 100644 index e8521f834..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_wininst.py +++ /dev/null @@ -1,82 +0,0 @@ -from distutils.command.bdist_wininst import bdist_wininst as _bdist_wininst -import os, sys - -class bdist_wininst(_bdist_wininst): - _good_upload = _bad_upload = None - - def create_exe(self, arcname, fullname, bitmap=None): - _bdist_wininst.create_exe(self, arcname, fullname, bitmap) - installer_name = self.get_installer_filename(fullname) - if self.target_version: - pyversion = self.target_version - # fix 2.5+ bdist_wininst ignoring --target-version spec - self._bad_upload = ('bdist_wininst', 'any', installer_name) - else: - pyversion = 'any' - self._good_upload = ('bdist_wininst', pyversion, installer_name) - - def _fix_upload_names(self): - good, bad = self._good_upload, self._bad_upload - dist_files = getattr(self.distribution, 'dist_files', []) - if bad in dist_files: - dist_files.remove(bad) - if good not in dist_files: - dist_files.append(good) - - def reinitialize_command (self, command, reinit_subcommands=0): - cmd = self.distribution.reinitialize_command( - command, reinit_subcommands) - if command in ('install', 'install_lib'): - cmd.install_lib = None # work around distutils bug - return cmd - - def run(self): - self._is_running = True - try: - _bdist_wininst.run(self) - self._fix_upload_names() - finally: - self._is_running = False - - - if not hasattr(_bdist_wininst, 'get_installer_filename'): - def get_installer_filename(self, fullname): - # Factored out to allow overriding in subclasses - if self.target_version: - # if we create an installer for a specific python version, - # it's better to include this in the name - installer_name = os.path.join(self.dist_dir, - "%s.win32-py%s.exe" % - (fullname, self.target_version)) - else: - installer_name = os.path.join(self.dist_dir, - "%s.win32.exe" % fullname) - return installer_name - # get_installer_filename() - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_wininst.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/bdist_wininst.pyc deleted file mode 100644 index 58a7fb60d90c8b2507a02a178cbb362bcec6cf91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2671 zcmc&$Yj5L36uo1oNz=!+EVL{S3Go3b5^AO06+%J?@mTn@idYv^h$0y~o}^A4JMv7* zW|e;G{#5<}KLF0TabMy)O*4~wXU4vF&N*|Z;orMk>Cs=WM$&vj{C<n(zDJkgYorjF z85sm(=m%1SG6;1Jc1s2=$wIM#jE!V1c`I@y^7{ZzASb;Iye9t#pPqr`chRL;?tJ`b zUgo9q{Rks+FFYf=Q*>5@ujxn&@ffDVsBe+W2J=FsL7Pz!o`aax@PkdUU9nq|ZOBz1 z?pMj$x_Dbkk?5qi$%rj<Z8RqM1DZQS=S8MQRw66(fviHgYKehAg%ik?k;@jRr=ip@ z8{<-wK^m);j6)8_Eh#mz_0($P&J-34U?I%wt$UhDx$H3+{|H@t4<NsVp;2uUZ)5w~ z`a`%A>tlkK6oswhabDOmnOS|<CpBj;Z0+)@^xOKrB#RgGqDnHqLw{0L*8}UQ#KPHP z>^m@$dZce7O5;UQsKeya+|QD^M!5~Hvt7*2mrcwb9MR65!^*xIPI7;?NQb9+`CT!t zZFa{>^K$sYri;n&=cPZZ${)*%;j`l}hcEMV=yGq5=E>+hnOHY;)-UG1stPw8RkK-A zX2W|p9nY5$q2v}EVH9&{_Dt7wgM*-LMwB1-$)<dR2W4>G8woDKZXg~+D#1|L1X>Q| z5~QjY&f8MIpeUvgfvUkkP?Sn2=N+m4&^fSes1(j2#z`+gpuW<m!Y5r$agUg5q`cDt zZ;AJ{a>SK&o-RB|<ciwPstc=TGN0Qr>v1CyN%FMFsY)qLvWVM%I2!yr2oF`hZbTPT zBknN<9pxwHU2|Y|%syI9e?;222mUHGPhpS*d;zW=MI2=EfN}t=!NU=;1@3XkLk;6Z z0qLuR8+oew8#^xYRGDyux*2pl9(NZgru!K5@1d(LYLw5DB7bA!Msx~xzbb9?K33cz zfv>$@!@aH_j@=?{MxD|#nq?2iO!NeaeTe2*R0M}(NB{J2@POPD!!O{V7_yiddGirZ z1!^8#3Y*llSmn(rNbnH6F8dA6iI(~PZCUxHUf6XN%3WM9N)-J`#1o-tU?4i6!@xf! zg|qs+%K8Ce`UKg0igp82Xm-t`Afh}*OrA=;!Ri$pLITd8iZ{F~)>r`~6cOrIXUBmY zQpSOlAOB|^3XHj)Mr~<s2*;!JnLEa1`TW_@d<heGfF7gkQ4Z)W8!;j9BvLt5={)gg zYD}xV^sE$Gf3m#R>qkM3D1?Z|@&Vx{te>N;%XZKW_e^LGgFS%W?=d$`KGr%C$686_ zcvfYL!p3p*0T$d=QoRFIQ!4g|RBBB)OB}1KYEOy0-LP8!`(=g1wCd@u+h!}++3s%c zbh_O=qkMX%PR4Kv6z;gGBFFbGJ^klty(Q{Z&y-ub2i}^}_4S&dZ&+3w8QwQff`0*C C-E)rs diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_ext.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_ext.py deleted file mode 100644 index 50a039ce5..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_ext.py +++ /dev/null @@ -1,298 +0,0 @@ -from distutils.command.build_ext import build_ext as _du_build_ext -try: - # Attempt to use Pyrex for building extensions, if available - from Pyrex.Distutils.build_ext import build_ext as _build_ext -except ImportError: - _build_ext = _du_build_ext - -import os, sys -from distutils.file_util import copy_file -from setuptools.extension import Library -from distutils.ccompiler import new_compiler -from distutils.sysconfig import customize_compiler -try: - # Python 2.7 or >=3.2 - from sysconfig import _CONFIG_VARS -except ImportError: - from distutils.sysconfig import get_config_var - get_config_var("LDSHARED") # make sure _config_vars is initialized - del get_config_var - from distutils.sysconfig import _config_vars as _CONFIG_VARS -from distutils import log -from distutils.errors import * - -have_rtld = False -use_stubs = False -libtype = 'shared' - -if sys.platform == "darwin": - use_stubs = True -elif os.name != 'nt': - try: - from dl import RTLD_NOW - have_rtld = True - use_stubs = True - except ImportError: - pass - -def if_dl(s): - if have_rtld: - return s - return '' - - - - - - -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) - - - if _build_ext is not _du_build_ext and not hasattr(_build_ext,'pyrex_sources'): - # Workaround for problems using some Pyrex versions w/SWIG and/or 2.4 - def swig_sources(self, sources, *otherargs): - # first do any Pyrex processing - sources = _build_ext.swig_sources(self, sources) or sources - # Then do any actual SWIG stuff on the remainder - return _du_build_ext.swig_sources(self, sources, *otherargs) - - - - 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] - 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 = ext._links_to_dynamic = \ - self.shlibs and self.links_to_dynamic(ext) or False - ext._needs_stub = ltd and use_stubs and not isinstance(ext,Library) - 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 - ) - if sys.platform == "darwin": - 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) - - 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): - _compiler = self.compiler - try: - if isinstance(ext,Library): - self.compiler = self.shlib_compiler - _build_ext.build_extension(self,ext) - if ext._needs_stub: - self.write_stub( - self.get_finalized_command('build_py').build_lib, 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]+['']) - for libname in ext.libraries: - if pkg+libname in libnames: return True - return False - - def get_outputs(self): - outputs = _build_ext.get_outputs(self) - optimize = self.get_finalized_command('build_py').optimize - for ext in self.extensions: - if ext._needs_stub: - base = os.path.join(self.build_lib, *ext._full_name.split('.')) - outputs.append(base+'.py') - outputs.append(base+'.pyc') - if optimize: - outputs.append(base+'.pyo') - return outputs - - 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/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_ext.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_ext.pyc deleted file mode 100644 index 3cd7ebf1de51b5fc35652fd8cb1f9d96eb3c4588..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10990 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 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_py.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_py.py deleted file mode 100644 index 8751acd49..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_py.py +++ /dev/null @@ -1,280 +0,0 @@ -import os.path, sys, fnmatch -from distutils.command.build_py import build_py as _build_py -from distutils.util import convert_path -from glob import glob - -try: - from distutils.util import Mixin2to3 as _Mixin2to3 - # add support for converting doctests that is missing in 3.1 distutils - 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) - -except ImportError: - class Mixin2to3: - def run_2to3(self, files, doctests=True): - # Nothing done in 2.x - pass - -class build_py(_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): - _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(_build_py.get_outputs(self, include_bytecode=0)) - - def __getattr__(self,attr): - if attr=='data_files': # lazily compute data files - self.data_files = files = self._get_data_files(); return files - return _build_py.__getattr__(self,attr) - - def build_module(self, module, module_file, package): - outfile, copied = _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() - data = [] - for package in self.packages or (): - # 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('.'))) - - # Length of path to strip from found files - plen = len(src_dir)+1 - - # Strip directory from globbed filenames - filenames = [ - file[plen:] for file in self.find_data_files(package, src_dir) - ] - data.append( (package, src_dir, build_dir, filenames) ) - return data - - def find_data_files(self, package, src_dir): - """Return filenames for package's data files in 'src_dir'""" - globs = (self.package_data.get('', []) - + self.package_data.get(package, [])) - files = self.manifest_files.get(package, [])[:] - for pattern in globs: - # Each pattern has to be converted to a platform-specific path - files.extend(glob(os.path.join(src_dir, convert_path(pattern)))) - return self.exclude_data_files(package, src_dir, files) - - def build_package_data(self): - """Copy data files into build directory""" - lastdir = None - 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 # kludge 2.4 for lazy computation - - if sys.version<"2.4": # Python 2.4 already has this code - def get_outputs(self, include_bytecode=1): - """Return complete list of files copied to the build directory - - This includes both '.py' files and data files, as well as '.pyc' - and '.pyo' files if 'include_bytecode' is true. (This method is - needed for the 'install_lib' command to do its job properly, and to - generate a correct installation manifest.) - """ - return _build_py.get_outputs(self, include_bytecode) + [ - os.path.join(build_dir, filename) - for package, src_dir, build_dir,filenames in self.data_files - for filename in filenames - ] - - 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 = _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 - - f = open(init_py,'rbU') - if 'declare_namespace'.encode() not in f.read(): - from distutils import log - log.warn( - "WARNING: %s is a namespace package, but its __init__.py does\n" - "not declare_namespace(); setuptools 0.7 will REQUIRE this!\n" - '(See the setuptools manual under "Namespace Packages" for ' - "details.)\n", package - ) - f.close() - return init_py - - def initialize_options(self): - self.packages_checked={} - _build_py.initialize_options(self) - - - def get_package_dir(self, package): - res = _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'""" - globs = (self.exclude_package_data.get('', []) - + self.exclude_package_data.get(package, [])) - bad = [] - for pattern in globs: - bad.extend( - fnmatch.filter( - files, os.path.join(src_dir, convert_path(pattern)) - ) - ) - bad = dict.fromkeys(bad) - seen = {} - return [ - f for f in files if f not in bad - and f not in seen and seen.setdefault(f,1) # ditch dupes - ] - - -def assert_relative(path): - if not os.path.isabs(path): - return path - from distutils.errors import DistutilsSetupError - raise DistutilsSetupError( -"""Error: setup script specifies an absolute path: - - %s - -setup() arguments must *always* be /-separated paths relative to the -setup.py directory, *never* absolute paths. -""" % path - ) - - - - - - - - - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_py.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/build_py.pyc deleted file mode 100644 index dc3a7c49501a14b7c6b7cabf087d3ebf65255131..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12692 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 VEdYOJolEs+Zp=BCr>_3=e*nb6zhM9X diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/develop.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/develop.py deleted file mode 100644 index 1d500040d..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/develop.py +++ /dev/null @@ -1,167 +0,0 @@ -from setuptools.command.easy_install import easy_install -from distutils.util import convert_path, subst_vars -from pkg_resources import Distribution, PathMetadata, normalize_path -from distutils import log -from distutils.errors import DistutilsError, DistutilsOptionError -import os, sys, setuptools, glob - -class develop(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() - 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: - raise DistutilsError( - "Please rename %r to %r before using 'develop'" - % (ei.egg_info, ei.broken_egg_info) - ) - 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')) - - self.egg_link = os.path.join(self.install_dir, ei.egg_name+'.egg-link') - self.egg_base = ei.egg_base - if self.egg_path is None: - self.egg_path = os.path.abspath(ei.egg_base) - - target = normalize_path(self.egg_base) - if normalize_path(os.path.join(self.install_dir, self.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 = Distribution( - target, - PathMetadata(target, os.path.abspath(ei.egg_info)), - project_name = ei.egg_name - ) - - p = self.egg_base.replace(os.sep,'/') - if p!= os.curdir: - p = '../' * (p.count('/')+1) - self.setup_path = p - p = normalize_path(os.path.join(self.install_dir, self.egg_path, p)) - if p != normalize_path(os.curdir): - raise DistutilsOptionError( - "Can't get a consistent path to setup script from" - " installation directory", p, normalize_path(os.curdir)) - - def install_for_development(self): - if sys.version_info >= (3,) 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 = 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 - self.dist._provider = PathMetadata(build_path, ei_cmd.egg_info) # XXX - 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 - - # 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: - f = open(self.egg_link,"w") - f.write(self.egg_path + "\n" + self.setup_path) - f.close() - # 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) - f = open(script_path,'rU') - script_text = f.read() - f.close() - self.install_script(dist, script_name, script_text, script_path) - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/develop.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/develop.pyc deleted file mode 100644 index 8adf38839d86f6273ebf88b7bddc4968fa116440..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6131 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 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/easy_install.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/easy_install.py deleted file mode 100644 index 3194644e8..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/easy_install.py +++ /dev/null @@ -1,2002 +0,0 @@ -#!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://pythonhosted.org/setuptools/easy_install.html - -""" -import sys -import os -import zipimport -import shutil -import tempfile -import zipfile -import re -import stat -import random -import platform -from glob import glob -import pkg_resources -from setuptools import Command, _dont_write_bytecode -from setuptools.sandbox import run_setup -from distutils import log, dir_util -try: - # Python 2.7 or >=3.2 - from sysconfig import get_config_vars, get_path - def _get_platlib(): - return get_path("platlib") - def _get_purelib(): - return get_path("purelib") -except ImportError: - from distutils.sysconfig import get_config_vars, get_python_lib - def _get_platlib(): - return get_python_lib(True) - def _get_purelib(): - return get_python_lib(False) - -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 setuptools.command import setopt -from setuptools.archive_util import unpack_archive -from setuptools.package_index import PackageIndex -from setuptools.package_index import URL_SCHEME -from setuptools.command import bdist_egg, egg_info -from setuptools.compat import (iteritems, maxsize, xrange, basestring, unicode, - reraise) -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 - -if '__VENV_LAUNCHER__' in os.environ: - sys_executable = os.environ['__VENV_LAUNCHER__'] -else: - sys_executable = os.path.normpath(sys.executable) - -__all__ = [ - 'samefile', 'easy_install', 'PthDistributions', 'extract_wininst_cfg', - 'main', 'get_exe_prefixes', -] - -import site -HAS_USER_SITE = not sys.version < "2.6" and site.ENABLE_USER_SITE - -import struct -def is_64bit(): - return struct.calcsize("P") == 8 - -def samefile(p1,p2): - if hasattr(os.path,'samefile') and ( - os.path.exists(p1) and os.path.exists(p2) - ): - return os.path.samefile(p1,p2) - return ( - os.path.normpath(os.path.normcase(p1)) == - os.path.normpath(os.path.normcase(p2)) - ) - -if sys.version_info <= (3,): - def _to_ascii(s): - return s - def isascii(s): - try: - unicode(s, 'ascii') - return True - except UnicodeError: - return False -else: - def _to_ascii(s): - return s.encode('ascii') - def isascii(s): - try: - s.encode('ascii') - return True - except UnicodeError: - return False - -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"), - ("delete-conflicting", "D", "no longer needed; don't use this"), - ("ignore-conflicts-at-my-risk", None, - "no longer needed; don't use this"), - ("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', - 'delete-conflicting', 'ignore-conflicts-at-my-risk', 'editable', - 'no-deps', 'local-snapshots-ok', 'version' - ] - - if HAS_USER_SITE: - user_options.append(('user', None, - "install in user site-package '%s'" % site.USER_SITE)) - boolean_options.append('user') - - - negative_opt = {'always-unzip': 'zip-ok'} - create_index = PackageIndex - - def initialize_options(self): - if HAS_USER_SITE: - whereami = os.path.abspath(__file__) - self.user = whereami.startswith(site.USER_SITE) - else: - 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 HAS_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.delete_conflicting = None - self.ignore_conflicts_at_my_risk = 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): - for filename in blockers: - if os.path.exists(filename) or os.path.islink(filename): - log.info("Deleting %s", filename) - if not self.dry_run: - if os.path.isdir(filename) and not os.path.islink(filename): - rmtree(filename) - else: - os.unlink(filename) - - def finalize_options(self): - if self.version: - print('setuptools %s' % get_distribution('setuptools').version) - sys.exit() - - 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 HAS_USER_SITE: - self.config_vars['userbase'] = self.install_userbase - self.config_vars['usersite'] = self.install_usersite - - # fix the install_dir if "--user" was used - #XXX: duplicate of the code in the setup command - if self.user and HAS_USER_SITE: - self.create_home_path() - if self.install_userbase is None: - raise DistutilsPlatformError( - "User base directory is not specified") - self.install_base = self.install_platbase = self.install_userbase - if os.name == 'posix': - self.select_scheme("unix_user") - else: - self.select_scheme(os.name + "_user") - - 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.python.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, basestring): - 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.delete_conflicting and self.ignore_conflicts_at_my_risk: - raise DistutilsOptionError( - "Can't use both --delete-conflicting and " - "--ignore-conflicts-at-my-risk at the same time" - ) - 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 _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.""" - self._expand_attrs(['install_purelib', 'install_platlib', - 'install_lib', 'install_headers', - 'install_scripts', 'install_data',]) - - 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 xrange(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: - pid = random.randint(0, maxsize) - return os.path.join(self.install_dir, "test-easy-install-%s" % pid) - - def warn_deprecated_options(self): - if self.delete_conflicting or self.ignore_conflicts_at_my_risk: - log.warn( - "Note: The -D, --delete-conflicting and" - " --ignore-conflicts-at-my-risk no longer have any purpose" - " and should not be used." - ) - - 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 - - PYTHONPATH = os.environ.get('PYTHONPATH','').split(os.pathsep) - if instdir not in map(normalize_path, [_f for _f in PYTHONPATH if _f]): - # 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 - - def cant_write_to_target(self): - msg = """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 -""" % (sys.exc_info()[1], self.install_dir,) - - if not os.path.exists(self.install_dir): - msg += """ -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). -""" - else: - msg += """ -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://pythonhosted.org/setuptools/easy_install.html - -Please make the appropriate changes for your system and try again. -""" - 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) - try: - if ok_exists: os.unlink(ok_file) - dirname = os.path.dirname(ok_file) - if not os.path.exists(dirname): - os.makedirs(dirname) - f = open(pth_file,'w') - except (OSError,IOError): - self.cant_write_to_target() - else: - try: - f.write("import os; f = open(%r, 'w'); f.write('OK'); f.close()\n" % (ok_file,)) - f.close(); f=None - executable = sys.executable - if os.name=='nt': - dirname,basename = os.path.split(executable) - alt = os.path.join(dirname,'pythonw.exe') - if basename.lower()=='python.exe' and os.path.exists(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) - ) - - - - - - - def easy_install(self, spec, deps=False): - tmpdir = tempfile.mkdtemp(prefix="easy_install-") - download = None - if not self.editable: self.install_site_py() - - try: - if not isinstance(spec,Requirement): - if URL_SCHEME(spec): - # It's a url, download it to tmpdir and process - self.not_editable(spec) - download = self.package_index.download(spec, tmpdir) - return self.install_item(None, download, 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) - - finally: - if os.path.exists(tmpdir): - rmtree(tmpdir) - - 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.check_conflicts(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) - 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 or distreq - requirement = Requirement( - distreq.project_name, distreq.specs, requirement.extras - ) - log.info("Processing dependencies for %s", requirement) - try: - distros = WorkingSet([]).resolve( - [requirement], self.local_index, self.easy_install - ) - except DistributionNotFound: - e = sys.exc_info()[1] - raise DistutilsError( - "Could not find required distribution %s" % e.args - ) - except VersionConflict: - e = sys.exc_info()[1] - raise DistutilsError( - "Installed distribution %s conflicts with requirement %s" - % e.args - ) - 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): - log.warn( - "%r already exists in %s; build directory %s will not be kept", - 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 not self.exclude_scripts: - for args in get_script_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) - - def get_template(filename): - """ - There are a couple of template scripts in the package. This - function loads one of them and prepares it for use. - - These templates use triple-quotes to escape variable - substitutions so the scripts get the 2to3 treatment when build - on Python 3. The templates cannot use triple-quotes naturally. - """ - raw_bytes = resource_string('setuptools', template_name) - template_str = raw_bytes.decode('utf-8') - clean_template = template_str.replace('"""', '') - return clean_template - - if is_script: - template_name = 'script template.py' - if dev_path: - template_name = template_name.replace('.py', ' (dev).py') - script_text = (get_script_header(script_text) + - get_template(template_name) % locals()) - self.write_script(script_name, _to_ascii(script_text), 'b') - - 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) - - mask = current_umask() - if not self.dry_run: - ensure_directory(target) - f = open(target,"w"+mode) - f.write(contents) - f.close() - chmod(target, 0x1FF-mask) # 0777 - - - - - 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)] - - # 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) - self.check_conflicts(dist) - 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) - uncache_zipdir(destination) - 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" - elif 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))) - - 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 = dist.location = os.path.join(tmpdir, dist.egg_name()+'.egg') - 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') - self.delete_blockers( # delete entry-point scripts to avoid duping - [os.path.join(script_dir,args[0]) for args in get_script_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 check_conflicts(self, dist): - """Verify that there are no conflicting "old-style" packages""" - - return dist # XXX temporarily disable until new strategy is stable - from imp import find_module, get_suffixes - from glob import glob - - blockers = [] - names = dict.fromkeys(dist._get_metadata('top_level.txt')) # XXX private attr - - exts = {'.pyc':1, '.pyo':1} # get_suffixes() might leave one out - for ext,mode,typ in get_suffixes(): - exts[ext] = 1 - - for path,files in expand_paths([self.install_dir]+self.all_site_dirs): - for filename in files: - base,ext = os.path.splitext(filename) - if base in names: - if not ext: - # no extension, check for package - try: - f, filename, descr = find_module(base, [path]) - except ImportError: - continue - else: - if f: f.close() - if filename not in blockers: - blockers.append(filename) - elif ext in exts and base!='site': # XXX ugh - blockers.append(os.path.join(path,filename)) - if blockers: - self.found_conflicts(dist, blockers) - - return dist - - def found_conflicts(self, dist, blockers): - if self.delete_conflicting: - log.warn("Attempting to delete conflicting packages:") - return self.delete_blockers(blockers) - - msg = """\ -------------------------------------------------------------------------- -CONFLICT WARNING: - -The following modules or packages have the same names as modules or -packages being installed, and will be *before* the installed packages in -Python's search path. You MUST remove all of the relevant files and -directories before you will be able to use the package(s) you are -installing: - - %s - -""" % '\n '.join(blockers) - - if self.ignore_conflicts_at_my_risk: - msg += """\ -(Note: you can run EasyInstall on '%s' with the ---delete-conflicting option to attempt deletion of the above files -and/or directories.) -""" % dist.project_name - else: - msg += """\ -Note: you can attempt this installation again with EasyInstall, and use -either the --delete-conflicting (-D) option or the ---ignore-conflicts-at-my-risk option, to either delete the above files -and directories, or to ignore the conflicts, respectively. Note that if -you ignore the conflicts, the installed package(s) may not work. -""" - msg += """\ -------------------------------------------------------------------------- -""" - sys.stderr.write(msg) - sys.stderr.flush() - if not self.ignore_conflicts_at_my_risk: - raise DistutilsError("Installation aborted due to conflicts") - - 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 += """ - -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 -""" - if self.install_dir not in map(normalize_path,sys.path): - msg += """ - -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.) -""" - eggloc = dist.location - name = dist.project_name - version = dist.version - extras = '' # TODO: self.report_extras(req, dist) - return msg % locals() - - def report_editable(self, spec, setup_script): - dirname = os.path.dirname(setup_script) - python = sys.executable - return """\nExtracted 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. -""" % 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: - v = sys.exc_info()[1] - 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]) | 0x16D) & 0xFED # 0555, 07755 - chmod(f, mode) - - def byte_compile(self, to_compile): - if _dont_write_bytecode: - self.warn('byte-compiling is disabled, skipping.') - 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 - - - - - - - - - - def no_default_version_msg(self): - return """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://pythonhosted.org/setuptools/easy_install.html#custom-installation-locations - -Please make the appropriate changes for your system and try again.""" % ( - 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") - current = "" - - if os.path.exists(sitepy): - log.debug("Checking existing site.py in %s", self.install_dir) - f = open(sitepy,'rb') - current = f.read() - # we want str, not bytes - if sys.version_info >= (3,): - current = current.decode() - - f.close() - 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) - f = open(sitepy,'wb') - f.write(source) - f.close() - 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 iteritems(self.config_vars): - if path.startswith(home) and not os.path.isdir(path): - self.debug_print("os.makedirs('%s', 0700)" % path) - os.makedirs(path, 0x1C0) # 0700 - - - - - - - - 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 get_site_dirs(): - # return a list of 'site' dirs - sitedirs = [_f for _f in os.environ.get('PYTHONPATH', - '').split(os.pathsep) if _f] - 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: - sitedirs.append( - os.path.join(home, - 'Library', - 'Python', - sys.version[:3], - 'site-packages')) - for site_lib in (_get_purelib(), _get_platlib()): - if site_lib not in sitedirs: sitedirs.append(site_lib) - - if HAS_USER_SITE: - sitedirs.append(site.USER_SITE) - - 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) - - from setuptools.compat import StringIO, ConfigParser - import struct - 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)) - cfg = ConfigParser.RawConfigParser({'version':'','target_version':''}) - try: - part = f.read(cfglen) - # part is in bytes, but we need to read up to the first null - # byte. - if sys.version_info >= (2,6): - null_byte = bytes([0]) - else: - null_byte = chr(0) - config = part.split(null_byte, 1)[0] - # Now the config is in bytes, but on Python 3, it must be - # unicode for the RawConfigParser, so decode it. Is this the - # right encoding? - config = config.decode('ascii') - cfg.readfp(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 sys.version_info >= (3,): - 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 - - -def parse_requirement_arg(spec): - try: - return Requirement.parse(spec) - except ValueError: - raise DistutilsError( - "Not a URL, existing file, or requirement spec: %r" % (spec,) - ) - -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 - - data = '\n'.join(map(self.make_relative,self.paths)) - if data: - log.debug("Saving %s", self.filename) - data = ( - "import sys; sys.__plen = len(sys.path)\n" - "%s\n" - "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)\n" - ) % data - - if os.path.islink(self.filename): - os.unlink(self.filename) - f = open(self.filename,'wt') - f.write(data); f.close() - - elif os.path.exists(self.filename): - log.debug("Deleting empty %s", self.filename) - os.unlink(self.filename) - - self.dirty = False - - def add(self,dist): - """Add `dist` to the distribution map""" - if (dist.location not in self.paths and ( - dist.location not in self.sitedirs or - dist.location == os.getcwd() #account for '.' being in PYTHONPATH - )): - 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 - -def get_script_header(script_text, executable=sys_executable, wininst=False): - """Create a #! line, getting options (if any) from script_text""" - from distutils.command.build_scripts import first_line_re - - # first_line_re in Python >=3.1.4 and >=3.2.1 is a bytes pattern. - if not isinstance(first_line_re.pattern, str): - first_line_re = re.compile(first_line_re.pattern.decode()) - - first = (script_text+'\n').splitlines()[0] - match = first_line_re.match(first) - options = '' - if match: - options = match.group(1) or '' - if options: options = ' '+options - if wininst: - executable = "python.exe" - else: - executable = nt_quote_arg(executable) - hdr = "#!%(executable)s%(options)s\n" % locals() - if not isascii(hdr): - # Non-ascii path to sys.executable, use -x to prevent warnings - if options: - if options.strip().startswith('-'): - options = ' -x'+options.strip()[1:] - # else: punt, we can't do it, let the warning happen anyway - else: - options = ' -x' - executable = fix_jython_executable(executable, options) - hdr = "#!%(executable)s%(options)s\n" % locals() - return hdr - -def auto_chmod(func, arg, exc): - if func is os.remove and os.name=='nt': - chmod(arg, stat.S_IWRITE) - return func(arg) - et, ev, _ = sys.exc_info() - reraise(et, (ev[0], ev[1] + (" %s %s" % (func,arg)))) - -def uncache_zipdir(path): - """Ensure that the importer caches dont have stale info for `path`""" - from zipimport import _zip_directory_cache as zdc - _uncache(path, zdc) - _uncache(path, sys.path_importer_cache) - -def _uncache(path, cache): - if path in cache: - del cache[path] - else: - path = normalize_path(path) - for p in cache: - if normalize_path(p)==path: - del cache[p] - return - -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: - fp = open(executable) - magic = fp.read(2) - fp.close() - except (OSError,IOError): return executable - return magic == '#!' - -def nt_quote_arg(arg): - """Quote a command line argument according to Windows parsing rules""" - - result = [] - needquote = False - nb = 0 - - needquote = (" " in arg) or ("\t" in arg) - if needquote: - result.append('"') - - for c in arg: - if c == '\\': - nb += 1 - elif c == '"': - # double preceding backslashes, then add a \" - result.append('\\' * (nb*2) + '\\"') - nb = 0 - else: - if nb: - result.append('\\' * nb) - nb = 0 - result.append(c) - - if nb: - result.append('\\' * nb) - - if needquote: - result.append('\\' * nb) # double the trailing backslashes - result.append('"') - - return ''.join(result) - - - - - - - - - -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: - e = sys.exc_info()[1] - log.debug("chmod failed: %s", e) - -def fix_jython_executable(executable, options): - if sys.platform.startswith('java') and is_sh(executable): - # Workaround for Jython is not needed on Linux systems. - import java - if java.lang.System.getProperty("os.name") == "Linux": - return executable - - # Workaround Jython's sys.executable being a .sh (an invalid - # shebang line interpreter) - if options: - # Can't apply the workaround, leave it broken - log.warn("WARNING: Unable to adapt shebang line for Jython," - " the following script is NOT executable\n" - " see http://bugs.jython.org/issue1112 for" - " more information.") - else: - return '/usr/bin/env %s' % executable - return executable - - -def get_script_args(dist, executable=sys_executable, wininst=False): - """Yield write_script() argument tuples for a distribution's entrypoints""" - spec = str(dist.as_requirement()) - header = get_script_header("", executable, wininst) - for group in 'console_scripts', 'gui_scripts': - for name, ep in dist.get_entry_map(group).items(): - script_text = ( - "# EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r\n" - "__requires__ = %(spec)r\n" - "import sys\n" - "from pkg_resources import load_entry_point\n" - "\n" - "if __name__ == '__main__':" - "\n" - " sys.exit(\n" - " load_entry_point(%(spec)r, %(group)r, %(name)r)()\n" - " )\n" - ) % locals() - if sys.platform=='win32' or wininst: - # On Windows/wininst, add a .py extension and an .exe launcher - if group=='gui_scripts': - launcher_type = 'gui' - ext = '-script.pyw' - old = ['.pyw'] - new_header = re.sub('(?i)python.exe','pythonw.exe',header) - else: - launcher_type = 'cli' - ext = '-script.py' - old = ['.py','.pyc','.pyo'] - new_header = re.sub('(?i)pythonw.exe','python.exe',header) - if os.path.exists(new_header[2:-1].strip('"')) or sys.platform!='win32': - hdr = new_header - else: - hdr = header - yield (name+ext, hdr+script_text, 't', [name+x for x in old]) - 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') - else: - # On other platforms, we assume the right thing to do is to - # just write the stub with no extension. - yield (name, header+script_text) - -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 platform.machine().lower()=='arm': - launcher_fn = launcher_fn.replace(".", "-arm.") - 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 sys.version_info[0] < 3: - return manifest % vars() - else: - return manifest.decode('utf-8') % vars() - -def rmtree(path, ignore_errors=False, onerror=auto_chmod): - """Recursively delete a directory tree. - - This code is taken from the Python 2.4 version of 'shutil', because - the 2.3 version doesn't really work right. - """ - if ignore_errors: - def onerror(*args): - pass - elif onerror is None: - def onerror(*args): - raise - 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 current_umask(): - tmp = os.umask(0x12) # 022 - 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 - import distutils.core - - USAGE = """\ -usage: %(script)s [options] requirement_or_url ... - or: %(script)s --help -""" - - def gen_usage (script_name): - script = os.path.basename(script_name) - return USAGE % vars() - - def with_ei_usage(f): - old_gen_usage = distutils.core.gen_usage - try: - distutils.core.gen_usage = gen_usage - return f() - finally: - distutils.core.gen_usage = old_gen_usage - - class DistributionWithoutHelpCommands(Distribution): - common_usage = "" - - def _show_help(self,*args,**kw): - with_ei_usage(lambda: Distribution._show_help(self,*args,**kw)) - - if argv is None: - argv = sys.argv[1:] - - with_ei_usage(lambda: - setup( - script_args = ['-q','easy_install', '-v']+argv, - script_name = sys.argv[0] or 'easy_install', - distclass=DistributionWithoutHelpCommands, **kw - ) - ) - - - - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/easy_install.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/easy_install.pyc deleted file mode 100644 index 1b062271bf5f7ecd418fb84418dea768f7fe7381..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71108 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 Bc5DCu diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/egg_info.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/egg_info.py deleted file mode 100644 index 642687b23..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/egg_info.py +++ /dev/null @@ -1,489 +0,0 @@ -"""setuptools.command.egg_info - -Create a distribution's .egg-info directory and contents""" - -# This module should be kept compatible with Python 2.3 -import os, re, sys -from setuptools import Command -from distutils.errors import * -from distutils import log -from setuptools.command.sdist import sdist -from setuptools.compat import basestring -from distutils.util import convert_path -from distutils.filelist import FileList as _FileList -from pkg_resources import parse_requirements, safe_name, parse_version, \ - safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename -from setuptools.command.sdist import walk_revctrl - -class egg_info(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-svn-revision', 'r', - "Add subversion revision ID to version number"), - ('tag-date', 'd', "Add date stamp (e.g. 20050528) to version number"), - ('tag-build=', 'b', "Specify explicit tag to add to version number"), - ('no-svn-revision', 'R', - "Don't add subversion revision ID [default]"), - ('no-date', 'D', "Don't include date stamp [default]"), - ] - - boolean_options = ['tag-date', 'tag-svn-revision'] - negative_opt = {'no-svn-revision': 'tag-svn-revision', - 'no-date': 'tag-date'} - - - - - - - - def initialize_options(self): - self.egg_name = None - self.egg_version = None - self.egg_base = None - self.egg_info = None - self.tag_build = None - self.tag_svn_revision = 0 - self.tag_date = 0 - self.broken_egg_info = False - self.vtags = None - - def save_version_info(self, filename): - from setuptools.command.setopt import edit_config - edit_config( - filename, - {'egg_info': - {'tag_svn_revision':0, 'tag_date': 0, 'tag_build': self.tags()} - } - ) - - - - - - - - - - - - - - - - - - - - - - - def finalize_options (self): - self.egg_name = safe_name(self.distribution.get_name()) - self.vtags = self.tags() - self.egg_version = self.tagged_version() - - try: - list( - parse_requirements('%s==%s' % (self.egg_name,self.egg_version)) - ) - except ValueError: - raise 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 sys.version_info >= (3,): - 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 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 run(self): - self.mkpath(self.egg_info) - installer = self.distribution.fetch_build_egg - for ep in iter_entry_points('egg_info.writers'): - writer = ep.load(installer=installer) - 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 tags(self): - version = '' - if self.tag_build: - version+=self.tag_build - if self.tag_svn_revision and ( - os.path.exists('.svn') or os.path.exists('PKG-INFO') - ): version += '-r%s' % self.get_svn_revision() - if self.tag_date: - import time; version += time.strftime("-%Y%m%d") - return version - - - - - - - - - - - - - - - - - - @staticmethod - def get_svn_revision(): - revision = 0 - urlre = re.compile('url="([^"]+)"') - revre = re.compile('committed-rev="(\d+)"') - - for base,dirs,files in os.walk(os.curdir): - if '.svn' not in dirs: - dirs[:] = [] - continue # no sense walking uncontrolled subdirs - dirs.remove('.svn') - f = open(os.path.join(base,'.svn','entries')) - data = f.read() - f.close() - - if data.startswith('<?xml'): - dirurl = urlre.search(data).group(1) # get repository URL - localrev = max([int(m.group(1)) for m in revre.finditer(data)]+[0]) - else: - try: svnver = int(data.splitlines()[0]) - except: svnver=-1 - if svnver<8: - log.warn("unrecognized .svn/entries format; skipping %s", base) - dirs[:] = [] - continue - - data = list(map(str.splitlines,data.split('\n\x0c\n'))) - del data[0][0] # get rid of the '8' or '9' or '10' - dirurl = data[0][3] - localrev = max([int(d[9]) for d in data if len(d)>9 and d[9]]+[0]) - if base==os.curdir: - base_url = dirurl+'/' # save the root url - elif not dirurl.startswith(base_url): - dirs[:] = [] - continue # not part of the same svn tree, skip it - revision = max(revision, localrev) - - return str(revision or get_pkg_info_revision()) - - - - - 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): - """File list that accepts only existing, platform-independent paths""" - - def append(self, item): - if item.endswith('\r'): # Fix older sdists built on Windows - item = item[:-1] - path = convert_path(item) - - if sys.version_info >= (3,): - try: - if os.path.exists(path) or os.path.exists(path.encode('utf-8')): - self.files.append(path) - except UnicodeEncodeError: - # Accept UTF-8 filenames even if LANG=C - if os.path.exists(path.encode('utf-8')): - self.files.append(path) - else: - log.warn("'%s' not %s encodable -- skipping", path, - sys.getfilesystemencoding()) - else: - if os.path.exists(path): - self.files.append(path) - - - - - - - - -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.filelist.findall() - 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 write_manifest (self): - """Write the file list in 'self.filelist' (presumably as filled in - by 'add_defaults()' and 'read_template()') to the manifest file - named by 'self.manifest'. - """ - # The manifest must be UTF-8 encodable. See #303. - if sys.version_info >= (3,): - files = [] - for file in self.filelist.files: - try: - file.encode("utf-8") - except UnicodeEncodeError: - log.warn("'%s' not UTF-8 encodable -- skipping" % file) - else: - files.append(file) - self.filelist.files = files - - files = self.filelist.files - if os.sep!='/': - files = [f.replace(os.sep,'/') for f in files] - self.execute(write_file, (self.manifest, files), - "writing manifest file '%s'" % self.manifest) - - def warn(self, msg): # suppress missing-file warnings from sdist - if not msg.startswith("standard file not found:"): - sdist.warn(self, msg) - - def add_defaults(self): - sdist.add_defaults(self) - 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() - ei_cmd = self.get_finalized_command('egg_info') - self.filelist.include_pattern("*", prefix=ei_cmd.egg_info) - - def prune_file_list (self): - build = self.get_finalized_command('build') - base_dir = self.distribution.get_fullname() - self.filelist.exclude_pattern(None, prefix=build.build_base) - self.filelist.exclude_pattern(None, prefix=base_dir) - sep = re.escape(os.sep) - self.filelist.exclude_pattern(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) - if sys.version_info >= (3,): - contents = contents.encode("utf-8") - f = open(filename, "wb") # always write POSIX-style manifest - f.write(contents) - f.close() - - - - - - - - - - - - - -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) - from setuptools.command import bdist_egg - 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(cmd, basename, filename): - dist = cmd.distribution - data = ['\n'.join(yield_lines(dist.install_requires or ()))] - for extra,reqs in (dist.extras_require or {}).items(): - data.append('\n\n[%s]\n%s' % (extra, '\n'.join(yield_lines(reqs)))) - cmd.write_or_delete_file("requirements", filename, ''.join(data)) - -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(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,basestring) or ep is None: - data = ep - elif ep is not None: - data = [] - for section, contents in ep.items(): - if not isinstance(contents,basestring): - contents = EntryPoint.parse_group(section, contents) - contents = '\n'.join(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(): - # See if we can get a -r### off of PKG-INFO, in case this is an sdist of - # a subversion revision - # - if os.path.exists('PKG-INFO'): - f = open('PKG-INFO','rU') - for line in f: - match = re.match(r"Version:.*-r(\d+)\s*$", line) - if match: - return int(match.group(1)) - f.close() - return 0 - - - -# diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/egg_info.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/egg_info.pyc deleted file mode 100644 index 74457963447fff7eb7db37ca8831c0a8101027b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18970 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 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install.py deleted file mode 100644 index 247c4f259..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install.py +++ /dev/null @@ -1,124 +0,0 @@ -import setuptools, sys, glob -from distutils.command.install import install as _install -from distutils.errors import DistutilsArgError - -class install(_install): - """Use easy_install to install the package, w/dependencies""" - - user_options = _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 = _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): - _install.initialize_options(self) - self.old_and_unmanageable = None - self.single_version_externally_managed = None - self.no_compile = None # make DISTUTILS_DEBUG work right! - - def finalize_options(self): - _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 _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 _install.run(self) - - # Attempt to detect whether we were called from setup() or by another - # command. If we were called by setup(), our caller will be the - # 'run_command' method in 'distutils.dist', and *its* caller will be - # the 'run_commands' method. If we were called any other way, our - # immediate caller *might* be 'run_command', but it won't have been - # called by 'run_commands'. This is slightly kludgy, but seems to - # work. - # - caller = sys._getframe(2) - caller_module = caller.f_globals.get('__name__','') - caller_name = caller.f_code.co_name - - if caller_module != 'distutils.dist' or caller_name!='run_commands': - # We weren't called from the command line or setup(), so we - # should run in backward-compatibility mode to support bdist_* - # commands. - _install.run(self) - else: - self.do_egg_install() - - - - - - - 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 _install.sub_commands if cmd[0] not in install._nc - ] + install.new_commands - - - - - - - - - - - - - - - - -# diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install.pyc deleted file mode 100644 index 09ef39be247a49c3e7c305fa2220145c7f651251..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4114 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 Co#hw+ diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_egg_info.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_egg_info.py deleted file mode 100644 index f44b34b55..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_egg_info.py +++ /dev/null @@ -1,125 +0,0 @@ -from setuptools import Command -from setuptools.archive_util import unpack_archive -from distutils import log, dir_util -import os, shutil, pkg_resources - -class install_egg_info(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 = [self.target] - - def run(self): - self.run_command('egg_info') - target = self.target - 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) - - - - - - - - - - - - - - - - - - - - - - - - - - def install_namespaces(self): - nsp = self._get_all_ns_packages() - if not nsp: return - filename,ext = os.path.splitext(self.target) - filename += '-nspkg.pth'; self.outputs.append(filename) - log.info("Installing %s",filename) - if not self.dry_run: - f = open(filename,'wt') - for pkg in nsp: - # ensure pkg is not a unicode string under Python 2.7 - pkg = str(pkg) - pth = tuple(pkg.split('.')) - trailer = '\n' - if '.' in pkg: - trailer = ( - "; m and setattr(sys.modules[%r], %r, m)\n" - % ('.'.join(pth[:-1]), pth[-1]) - ) - f.write( - "import sys,types,os; " - "p = os.path.join(sys._getframe(1).f_locals['sitedir'], " - "*%(pth)r); " - "ie = os.path.exists(os.path.join(p,'__init__.py')); " - "m = not ie and " - "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)%(trailer)s" - % locals() - ) - f.close() - - def _get_all_ns_packages(self): - nsp = {} - for pkg in self.distribution.namespace_packages or []: - pkg = pkg.split('.') - while pkg: - nsp['.'.join(pkg)] = 1 - pkg.pop() - nsp=list(nsp) - nsp.sort() # set up shorter names first - return nsp - - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_egg_info.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_egg_info.pyc deleted file mode 100644 index 54a2b35f78b8946da7a79ee5f03f07beec9b503d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5057 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 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_lib.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_lib.py deleted file mode 100644 index 82afa1421..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_lib.py +++ /dev/null @@ -1,82 +0,0 @@ -from distutils.command.install_lib import install_lib as _install_lib -import os - -class install_lib(_install_lib): - """Don't add compiled flags to filenames of non-Python files""" - - def _bytecode_filenames (self, py_filenames): - bytecode_files = [] - for py_file in py_filenames: - if not py_file.endswith('.py'): - continue - if self.compile: - bytecode_files.append(py_file + "c") - if self.optimize > 0: - bytecode_files.append(py_file + "o") - - return bytecode_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): - exclude = {} - nsp = self.distribution.namespace_packages - - if (nsp and self.get_finalized_command('install') - .single_version_externally_managed - ): - for pkg in nsp: - parts = pkg.split('.') - while parts: - pkgdir = os.path.join(self.install_dir, *parts) - for f in '__init__.py', '__init__.pyc', '__init__.pyo': - exclude[os.path.join(pkgdir,f)] = 1 - parts.pop() - return exclude - - 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 _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 = _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/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_lib.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_lib.pyc deleted file mode 100644 index edf5a65e680b4602013ea204db5b3eaf41ffac51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3532 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 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_scripts.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_scripts.py deleted file mode 100644 index 105dabca6..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_scripts.py +++ /dev/null @@ -1,54 +0,0 @@ -from distutils.command.install_scripts import install_scripts \ - as _install_scripts -from pkg_resources import Distribution, PathMetadata, ensure_directory -import os -from distutils import log - -class install_scripts(_install_scripts): - """Do normal script install, plus any egg_info wrapper scripts""" - - def initialize_options(self): - _install_scripts.initialize_options(self) - self.no_ep = False - - def run(self): - from setuptools.command.easy_install import get_script_args - from setuptools.command.easy_install import sys_executable - - self.run_command("egg_info") - if self.distribution.scripts: - _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') - executable = getattr(bs_cmd,'executable',sys_executable) - is_wininst = getattr( - self.get_finalized_command("bdist_wininst"), '_is_running', False - ) - for args in get_script_args(dist, executable, is_wininst): - 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, 0x1FF-mask) # 0777 - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_scripts.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/install_scripts.pyc deleted file mode 100644 index fd03158256b5513dea4c42a1806bf4621a9ebbee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2796 zcmc&$%WfP+6usT^u*b1uCk7LuNDP9AStOQVg9HfiFrY|ah0Y>kG^o|nT^{$OA46Al zoI&H2v*cS?@J+1P@&VzT+tYTE4<IA=?W*c}+<Wdhx7_)6XKQ-@@1J8?|2lYog~v`| z68w3RiR7M)eeu}$CF@Aum2p?{o{W2v_hsB~zI7zqknx7D>q@pM`9Q`4eCvtv<;0Vu zFV96TM1C2g(~(D`4IGocz;EQC<#yREtc$WNv~iU#oE_06w+(ZYT34mh+NEWo0}ms2 z`jc@{61m9jVTLJeU70XRD-*l2S{^sMa)+#(1$aqJ!=I1m8$9+Nj1i$nus%bElj9C! zWur?^lde1m2t5fNje1=5Im}TxEXpd6vSH)vaP9iN;UcT;Fe;WqGn<8JaZ(P?s%Wt= z)q19l87?2X@hu*E8^(#uJy`)FPdw+d72<3GP@H=_>T(hz#ip;I<ZfaxEmD_8S^B#P z%LP%gj=p{$W!7k`C_}SoFyT(tWG5rMMUBnTN<N#+Qg>QUCy&$O>+Ga5$xE$iT1<}2 zw4O~KF5PKad{;c3d~*2d<i~V6v8gln7g78qni)I6f%U?bWo9RFndecFOkVT&aIp;f zIB^S)r8na3cnZq^ZThXS^bj~QLf$D4&w&j4;2QeAoP(EuX|5?EZ0vMp-jnKqxW3Fc zT0Dz^%tRsGq@53>3Kd&+wwPfoKktaUCaaFjx5e$O8|+?}3*-ZhUA231(UtSAZiKZx zUE33PLsmV~eC5kUN6z~?((J#%ImxCVRs6Ie&pwhBvW-nJA749i^y|KyH{R{bYE%9I zD8Kz9kCg$0<@hzN%#2&>B#f$=ZBlz36YbK5=9!6W7fmzcHZjyv5n+i;>oiMRi8<!r zrP(?mf!e||Pzo#pB&3`TtGd9zZ1fiT?md{RJRh#}d}t!OZ0Q+r=YXqq3oH-U(^SAb z<5JNq1#8U*OuwUSu|l0MYj=`n#s-YUy$!?APtro^p0v9Ll*whZ)5w~D0t>cZ9xkHX zs5?aDsi`dM2~WqCk#kkRw)%Hgfz)f1M#Mi*a}^W`Y|=2!6GsX&9&iruT8;(Ggn|p` zS|~YBbA|UC6CMFnntVtvyghHv-|@C#2j0N%`nz7oyXD=)`zBldyPi{EV>-|1`ThZq z{R`$5dE!EVC~+Ymeb6CvN{&MTkVprks>pf6@gBcHR?tEtNXU>vpo;r)A*~j!iT#ra zS%0H0amhe89eIb#2eKMap%fk0qO;589<<1ru$yuVGra=d_Se^r{TRMKW`<Fzhgb9; zl4wI$4&A9~%k}W`N@)a0QfWnvPxCTSMa6YhnZkv29@!^a%^x%+8hRPtwe1yweeYUD z^DKP<P>)9}=fMq{4``T?fcPq-cy}mQ+v*8Na50FKR=+QB1!`knrbTeTW#k|4nj%qB zC)JX&4X7raS>luWuIz52$VzKQN^25a4{W3us#qwx7$U*K=2!%6boX?I8_*<IuIup* z1UF7kBN`g+o4sl7AOhZUmJo@5;2nVAN_TI|+sDnb<&6lO){ao44nvi07$Vp@Gw8A| zgke&~VW?MEKp6$?){U5Xh`fQTl*iIP%Ut!nzCY*=Zfi>2`xs$m!aq)#y)4r$q1uv* zNz&9^mjA_*Sy&lc)>Vw6OYt{_lq?Duqa#r+cU8h_=vU_d2SJnfMU$>C>9c~d=ikxN F_8;8rq^<w} diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/launcher manifest.xml b/PythonEnv/2.7/Lib/site-packages/setuptools/command/launcher manifest.xml deleted file mode 100644 index 844d2264c..000000000 --- a/PythonEnv/2.7/Lib/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/PythonEnv/2.7/Lib/site-packages/setuptools/command/register.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/register.py deleted file mode 100644 index 3b2e08590..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/register.py +++ /dev/null @@ -1,10 +0,0 @@ -from distutils.command.register import register as _register - -class register(_register): - __doc__ = _register.__doc__ - - def run(self): - # Make sure that we are using valid current name/version info - self.run_command('egg_info') - _register.run(self) - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/register.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/register.pyc deleted file mode 100644 index fb8060cf8fa1e005c3310c651382a37c74bdf19e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 809 zcmc&y%}&EG40h7-v!O|xIdHC!)&mzLgb=?sG(mSjRFR^#NxO_TothMB61VZFya5jY zPPPG008#ANiDQ3X;^1RA$VTrEIjl#3>jjEALM3n#r~qmL2?Zi3ND2i35x^V365uI8 zrw5a83&YhXj*y^bcTu&nRL06SMjO5hxZ^7nbAU<$U;@lJ3m^$xJxrVQAfEU%xeIne zQLa(UA*xq^nFqEcKrDe7bz9EC`;*Ycjy(WbmR#wg2^}fBhpO!~&zrhVwXl8k`39qP zA$Yn%-$Td9st9ofuS|iKIAx`>(=KC=N?%q*E5$D>Q<~k#tSj05!cH4~t6$i0bi(db z#*DIZG*9#Aw3LP!X}h^?n#!;>7`DL?%@?t&zKvp>0dz?G<9bG%>$H}f+X0?%UN@qv z(2YI89ls}<95>w6AM}4t0jq<<<SA^EJ{_<A!2P+vrs%AyOtdB+ZOHpZ@m&57x_{=g O)x(~<)-$f3_URX&#mLwI diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/rotate.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/rotate.py deleted file mode 100644 index b10acfb41..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/rotate.py +++ /dev/null @@ -1,83 +0,0 @@ -import distutils, os -from setuptools import Command -from setuptools.compat import basestring -from distutils.util import convert_path -from distutils import log -from distutils.errors import * - -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, basestring): - 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: - os.unlink(f) - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/rotate.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/rotate.pyc deleted file mode 100644 index 9ea14bedb8dbe1b64fe323397b3221135f1ba130..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3146 zcmc&$&2k$>5boKPWJ$JTCqRDqN%la>8xrY|Dk@b}LIH7ZU|>UGP$_J!v?F=t{gHP@ zNu07Tgm>U!c!%%`9Jq1h0pRN%|HM>Lz=cTK)=W=NPj}DP-Ru9p+8y<N{c=o4A0Pi8 z;V}mwDSnD_qQS{n(Lf2`quisyr-4t3<$TH;R5WSObn^z~Eh?61u;k`V)>E`;(020{ z<sJGeT_Ww%1S;F~1JQG$ZwFmI^kLY60ofn;Y=sI#y99E-DvG2`9it1zC^6dDIxDA+ zw*ua{Dj)0G#`DDPI4(PtS4SeO>^<88tt*>Yed2l(tWWTmO%M&I#nFMs=D^GJ9HncN zuG17wH)slhCZ)@4_Mk=SiVT)0U6nzbqKDym*7hdIrp~q1L6xVv4$_P*9xZHEmB!r0 za{9N+w}M@*=Ws9B3QGM1z6O&l*T%5@MPkQ0_bfY9n72XUvDI~H0$T;L7=*RnTV%CP zZy1gzAKgo{+HFeBb>Y=|Y^!=dc(S8w9oQXx*2EyGwc+5fDQ@Sk2{A7h#R&dX6L%O} zdB!(3gZGTtLVi3v_wkr(AOH<87E6$MfH*r2LQS}T-mn!mKrNH4s??UP5XWpABR(vK zH?qzLx!Y!Gqw@)yNJ0!0Qu@Jgn%SMjXt<q~ALkPU<)zUmD~FqUw3rUR*ta`X`Jj9} zyxqSu{4^U4O=fj(o{V>ssWwBS?P6}LDmTNigX7QvsXyPh7jRHkW;RRm?3s?Mxm@z= z;L44W>fkH!;8?Ib5|5uTKn!LQmEAVgSIG+Qo-6uZQR!ACFuZzKRy{gd-M`2|Vhuhs zIh;Oim+w#mA=~Xzy+=wZRw?VOQqea^0(U5K>$ykuPYi0unYAfxu&T{Rm+4TE?a+au zS(h^u-0wWv`%#Vo3f!J$N|6qti0i?_kZ)+qd<pv50<bl6J<cZk0j@Eq>Y%6qwNL`s zGkTuX$i(!<5o%9x9P0kGA8hoWW%CW*wb9qp>BbH7?q9W@LQ&G=7<uLj1baQkMo_R7 zBON4Vkd;<XQ6d;(w**up#!|G5dB_)IUWV71Nyrr@;?fgwLRr4rP3%QB=jL;{?gw>U z)e*~C9|VV4mj61*7h2Y2nwhLLHYvwCVl%`FGtV;{u>o$1GBLMrU<%B|i!#-dtkmf- zs>IT0m8Dt3{8iw69S6gxGic|So68`i)|9VS{5AQ%s8-dwy5QaM#%wMZuoL{Rf#ZOO zS_^!sRG^wGDip&{J^fAAJ>c;dI`m}X(+m(r$~5TGfk&5^4Wu?{)}q;xh_nd{fHqVf z`hspB8m`h|<5&*37Mz1lJi&Fwq6bheU{^d^=3|syq1h^<+@9lg=w#(+f0(fGYjh1e zpWfre%}4Lk(4)hq9OX75+i;Wzc?hqQc_B8OKQch=y&(Ly_cmx-@`wA~mee_5KF-QX zCEf6}#!d5T6g41aE`nT7r89))D2cclUpIy!E#1e>LoQI3nf0QKkLp+S7UqI!xai92 zaetEYr$Aqs6dLt|s4`M+xw*<<R%N9m&ar4=Gl+^^Rc)nh*BTAk=!nxnR@fU!j$D^6 zQ`p<I-j89H^yWpGXXS3lC=rN@jiT(RI7o&_vJ3hrLhY-_0rm=J-^8DEVG^LPt4r#t zx~aOV>s<loHGsdPLKc3hc}MKvKlX07>r4ZWIAH(2e>)8)O+4cI_MdvVypG8g$AX18 zmMRv<MU^gcjVT)x$7wajm;sh*Gv@k*w;X}h!sz<AblEisjL<`MQXcc7bKpf>Jfa@R z=}pS$e{10p2T8)isnSv{ujTnDV;#Tcb()<EA^V1Q=<-C$e#Eac5{}b%g9t3L@&b7B zzR*X$0llu?v$x!IL_?pc6n>W@TvksPH8&I^hP|q&$j#q%cl{xkZ^M=1GBEAFUGGm$ ChWd^G diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/saveopts.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/saveopts.py deleted file mode 100644 index 7209be4cd..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/saveopts.py +++ /dev/null @@ -1,24 +0,0 @@ -import distutils, os -from setuptools import Command -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/PythonEnv/2.7/Lib/site-packages/setuptools/command/saveopts.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/saveopts.pyc deleted file mode 100644 index 47e01ed8a2e18dc8dbf43cce26a4aa3df9812d70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1348 zcmc&z&2H2{4E9X2+aHRkI3RjJ3gVJWSAt6=R3V^6y`T!Vhe8w-C7DS&ZT^~>RIRjo zS{{Ul;|+KKu)Ry$Cx9sNcsw5a`)tSi^>8!W{rNeE)#Ks%7C-w1g~C@r1rXip0wTe7 z36+G}gUACxejZdl)FX&SP>&%RqtypJh63G3@Eu?Q@HJYafG6P?gPY&@9ESo`w}#@N zt?RT=p(Mit6j~XV<ZV-!lJ{-rOxq+`YPDO(bDLgiwAowi6zV-4Jfqu)nvq75aw1G6 z2}b0@^duyj_63R)3=-ta)Vq~wbg)cg1J?#=P?$>FJ#r>LJ9J%Tw7TzuV1{mz7iG}) zLF>+RkKqV2-^~dVu_ML@6z2zu8NfNfT!29-;o8AWz`20KZwBTb%n+-93km&8xZHsT z;QE+7Bpof#6(yke9>fynKFblz$1ocaOS*XkGu%oz_vsGiS>R<K_AieB-%|{G>P8HN z-3ZYdES9}omgjit5#B8ntNH{~pO8xL$f}HWy~zgZihFeDmaHnswo<#*K2aujm=ini zbZy-xYFIp_i*%^ml;?nAQ^}jO);tudze)O`38{q6=NnbQ3T0o8fp*R`rF8^1uNAKd zfmhq-yk4bMh{wRf7O1J$acSJykj1B_c~=#^R`;~bH1VO%hBE$i<IdXVLvt0sn(W0N zO%_|kzuTqxMOtbbbN^l2RyJOhDgHZ{lkSF-BLOD+m=K5!F_znM3uP#_#B&)^Ntj8J z5bq@6(j-aUs-dDSkxvrU=BU$;p|s6=!+*n+V%{<P*YtQq2*0KI9wR4YwT`OWKtV0S z>8Pxuf4aSG`OtB_rf3AWgW|4+lT{5TXu=-yR7~kMXZn9cxj*~Mj=Z5!Wx`Lzws<1{ E05h6TMgRZ+ diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/sdist.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/sdist.py deleted file mode 100644 index 39cd60439..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/sdist.py +++ /dev/null @@ -1,304 +0,0 @@ -from distutils.command.sdist import sdist as _sdist -from distutils.util import convert_path -from distutils import log -from glob import glob -import os, re, sys, pkg_resources -from glob import glob - -READMES = ('README', 'README.rst', 'README.txt') - -entities = [ - ("<","<"), (">", ">"), (""", '"'), ("'", "'"), - ("&", "&") -] - -def unescape(data): - for old,new in entities: - data = data.replace(old,new) - return data - -def re_finder(pattern, postproc=None): - def find(dirname, filename): - f = open(filename,'rU') - data = f.read() - f.close() - for match in pattern.finditer(data): - path = match.group(1) - if postproc: - path = postproc(path) - yield joinpath(dirname,path) - return find - -def joinpath(prefix,suffix): - if not prefix: - return suffix - return os.path.join(prefix,suffix) - - - - - - - - - -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 - -def _default_revctrl(dirname=''): - for path, finder in finders: - path = joinpath(dirname,path) - if os.path.isfile(path): - for path in finder(dirname,path): - if os.path.isfile(path): - yield path - elif os.path.isdir(path): - for item in _default_revctrl(path): - yield item - -def externals_finder(dirname, filename): - """Find any 'svn:externals' directories""" - found = False - f = open(filename,'rt') - for line in iter(f.readline, ''): # can't use direct iter! - parts = line.split() - if len(parts)==2: - kind,length = parts - data = f.read(int(length)) - if kind=='K' and data=='svn:externals': - found = True - elif kind=='V' and found: - f.close() - break - else: - f.close() - return - - for line in data.splitlines(): - parts = line.split() - if parts: - yield joinpath(dirname, parts[0]) - - -entries_pattern = re.compile(r'name="([^"]+)"(?![^>]+deleted="true")', re.I) - -def entries_finder(dirname, filename): - f = open(filename,'rU') - data = f.read() - f.close() - if data.startswith('<?xml'): - for match in entries_pattern.finditer(data): - yield joinpath(dirname,unescape(match.group(1))) - else: - svnver=-1 - try: svnver = int(data.splitlines()[0]) - except: pass - if svnver<8: - log.warn("unrecognized .svn/entries format in %s", os.path.abspath(dirname)) - return - for record in map(str.splitlines, data.split('\n\x0c\n')[1:]): - # subversion 1.6/1.5/1.4 - if not record or len(record)>=6 and record[5]=="delete": - continue # skip deleted - yield joinpath(dirname, record[0]) - - -finders = [ - (convert_path('CVS/Entries'), - re_finder(re.compile(r"^\w?/([^/]+)/", re.M))), - (convert_path('.svn/entries'), entries_finder), - (convert_path('.svn/dir-props'), externals_finder), - (convert_path('.svn/dir-prop-base'), externals_finder), # svn 1.4 -] - - - - - - - - - - - - -class sdist(_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 = {} - - 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) - - # Call check_metadata only if no 'check' command - # (distutils <= 2.6) - import distutils.command - if 'check' not in distutils.command.__all__: - self.check_metadata() - - 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 __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: - _sdist.read_template(self) - except: - sys.exc_info()[2].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. - if ( - sys.version_info < (2,7,2) - or (3,0) <= sys.version_info < (3,1,4) - or (3,2) <= sys.version_info < (3,2,1) - ): - read_template = __read_template_hack - - def add_defaults(self): - standards = [READMES, - self.distribution.script_name] - for fn in standards: - if isinstance(fn, tuple): - alts = fn - got_it = 0 - for fn in alts: - if os.path.exists(fn): - got_it = 1 - self.filelist.append(fn) - break - - if not got_it: - self.warn("standard file not found: should have one of " + - ', '.join(alts)) - else: - if os.path.exists(fn): - self.filelist.append(fn) - else: - self.warn("standard file '%s' not found" % fn) - - optional = ['test/test*.py', 'setup.cfg'] - for pattern in optional: - files = list(filter(os.path.isfile, glob(pattern))) - if files: - self.filelist.extend(files) - - # 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]) - - if self.distribution.has_ext_modules(): - build_ext = self.get_finalized_command('build_ext') - self.filelist.extend(build_ext.get_source_files()) - - if self.distribution.has_c_libraries(): - build_clib = self.get_finalized_command('build_clib') - self.filelist.extend(build_clib.get_source_files()) - - if self.distribution.has_scripts(): - build_scripts = self.get_finalized_command('build_scripts') - self.filelist.extend(build_scripts.get_source_files()) - - def check_readme(self): - for f in READMES: - if os.path.exists(f): - return - else: - self.warn( - "standard file not found: should have one of " +', '.join(READMES) - ) - - - def make_release_tree(self, base_dir, files): - _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 - - fp = open(self.manifest, 'rbU') - try: - first_line = fp.readline() - finally: - fp.close() - 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, 'rbU') - for line in manifest: - # The manifest must contain UTF-8. See #303. - if sys.version_info >= (3,): - 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() - - - - - - -# diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/sdist.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/sdist.pyc deleted file mode 100644 index c87bb863a93127ce3fa460ca3a2a502777f33d6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10827 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 VHCa15SE`+^InN;wnQ`Wh{TC20m1+P0 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/setopt.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/setopt.py deleted file mode 100644 index aa468c88f..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/setopt.py +++ /dev/null @@ -1,164 +0,0 @@ -import distutils, os -from setuptools import Command -from distutils.util import convert_path -from distutils import log -from distutils.errors import * - -__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. - """ - from setuptools.compat import ConfigParser - 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: - f = open(filename,'w'); opts.write(f); f.close() - -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/PythonEnv/2.7/Lib/site-packages/setuptools/command/setopt.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/setopt.pyc deleted file mode 100644 index d0610541abad37022018f9124c6287cae4d281f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6440 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 Tui;Y5zopWJa>H$0zjXb-T%9ya diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/test.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/test.py deleted file mode 100644 index db2fc7b14..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/test.py +++ /dev/null @@ -1,198 +0,0 @@ -from setuptools import Command -from distutils.errors import DistutilsOptionError -import sys -from pkg_resources import * -from pkg_resources import _namespace_packages -from unittest import TestLoader, main - -class ScanningLoader(TestLoader): - - def loadTestsFromModule(self, module): - """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. - """ - tests = [] - if module.__name__!='setuptools.tests.doctest': # ugh - 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 - - -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', - "Test suite to run (e.g. 'some_module.test_suite')"), - ] - - def initialize_options(self): - self.test_suite = None - self.test_module = None - self.test_loader = None - - - def finalize_options(self): - - 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" - elif self.test_module: - raise DistutilsOptionError( - "You may specify a module or a suite, but not both" - ) - - self.test_args = [self.test_suite] - - if self.verbose: - self.test_args.insert(0,'--verbose') - 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" - - - - def with_project_on_sys_path(self, func): - if sys.version_info >= (3,) 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 = 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: - sys.path.insert(0, normalize_path(ei_cmd.egg_base)) - working_set.__init__() - add_activation_listener(lambda dist: dist.activate()) - require('%s==%s' % (ei_cmd.egg_name, ei_cmd.egg_version)) - func() - finally: - sys.path[:] = old_path - sys.modules.clear() - sys.modules.update(old_modules) - working_set.__init__() - - - def run(self): - if self.distribution.install_requires: - self.distribution.fetch_build_eggs(self.distribution.install_requires) - if self.distribution.tests_require: - self.distribution.fetch_build_eggs(self.distribution.tests_require) - - if self.test_suite: - cmd = ' '.join(self.test_args) - if self.dry_run: - self.announce('skipping "unittest %s" (dry run)' % cmd) - else: - self.announce('running "unittest %s"' % cmd) - self.with_project_on_sys_path(self.run_tests) - - - def run_tests(self): - import unittest - - # 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 sys.version_info >= (3,) and getattr(self.distribution, 'use_2to3', False): - module = self.test_args[-1].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)) - - loader_ep = EntryPoint.parse("x="+self.test_loader) - loader_class = loader_ep.load(require=False) - cks = loader_class() - unittest.main( - None, None, [unittest.__file__]+self.test_args, - testLoader = cks - ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/test.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/test.pyc deleted file mode 100644 index 8aeda1e6e407efdc448d118197042362c2c6563a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6289 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 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload.py deleted file mode 100644 index 02d955eda..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload.py +++ /dev/null @@ -1,184 +0,0 @@ -"""distutils.command.upload - -Implements the Distutils 'upload' subcommand (upload package to PyPI).""" - -from distutils.errors import * -from distutils.core import Command -from distutils.spawn import spawn -from distutils import log -try: - from hashlib import md5 -except ImportError: - from md5 import md5 -import os -import sys -import socket -import platform -import base64 - -from setuptools.compat import urlparse, StringIO, httplib, ConfigParser - -class upload(Command): - - description = "upload binary package to PyPI" - - DEFAULT_REPOSITORY = 'https://pypi.python.org/pypi' - - user_options = [ - ('repository=', 'r', - "url of repository [default: %s]" % DEFAULT_REPOSITORY), - ('show-response', None, - 'display full response text from server'), - ('sign', 's', - 'sign files to upload using gpg'), - ('identity=', 'i', 'GPG identity used to sign files'), - ] - boolean_options = ['show-response', 'sign'] - - def initialize_options(self): - self.username = '' - self.password = '' - self.repository = '' - self.show_response = 0 - self.sign = False - self.identity = None - - def finalize_options(self): - if self.identity and not self.sign: - raise DistutilsOptionError( - "Must use --sign for --identity to have meaning" - ) - if 'HOME' in os.environ: - rc = os.path.join(os.environ['HOME'], '.pypirc') - if os.path.exists(rc): - self.announce('Using PyPI login from %s' % rc) - config = ConfigParser.ConfigParser({ - 'username':'', - 'password':'', - 'repository':''}) - config.read(rc) - if not self.repository: - self.repository = config.get('server-login', 'repository') - if not self.username: - self.username = config.get('server-login', 'username') - if not self.password: - self.password = config.get('server-login', 'password') - if not self.repository: - self.repository = self.DEFAULT_REPOSITORY - - def run(self): - if not self.distribution.dist_files: - raise DistutilsOptionError("No dist file created in earlier command") - for command, pyversion, filename in self.distribution.dist_files: - self.upload_file(command, pyversion, filename) - - def upload_file(self, command, pyversion, filename): - # 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 - f = open(filename,'rb') - content = f.read() - f.close() - basename = os.path.basename(filename) - comment = '' - if command=='bdist_egg' and self.distribution.has_ext_modules(): - comment = "built on %s" % platform.platform(terse=1) - data = { - ':action':'file_upload', - 'protocol_version':'1', - 'name':self.distribution.get_name(), - 'version':self.distribution.get_version(), - 'content':(basename,content), - 'filetype':command, - 'pyversion':pyversion, - 'md5_digest':md5(content).hexdigest(), - } - if command == 'bdist_rpm': - dist, version, id = platform.dist() - if dist: - comment = 'built for %s %s' % (dist, version) - elif command == 'bdist_dumb': - comment = 'built for %s' % platform.platform(terse=1) - data['comment'] = comment - - if self.sign: - asc_file = open(filename + ".asc") - data['gpg_signature'] = (os.path.basename(filename) + ".asc", asc_file.read()) - asc_file.close() - - # set up the authentication - auth = "Basic " + base64.encodestring(self.username + ":" + self.password).strip() - - # Build up the MIME payload for the POST data - boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' - sep_boundary = '\n--' + boundary - end_boundary = sep_boundary + '--' - body = StringIO.StringIO() - for key, value in data.items(): - # handle multiple entries for the same name - if type(value) != type([]): - value = [value] - for value in value: - if type(value) is tuple: - fn = ';filename="%s"' % value[0] - value = value[1] - else: - fn = "" - value = str(value) - body.write(sep_boundary) - body.write('\nContent-Disposition: form-data; name="%s"'%key) - body.write(fn) - body.write("\n\n") - body.write(value) - if value and value[-1] == '\r': - body.write('\n') # write an extra newline (lurve Macs) - body.write(end_boundary) - body.write("\n") - body = body.getvalue() - - self.announce("Submitting %s to %s" % (filename, self.repository), 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 = \ - urlparse(self.repository) - assert not params and not query and not fragments - if schema == 'http': - http = httplib.HTTPConnection(netloc) - elif schema == 'https': - http = httplib.HTTPSConnection(netloc) - else: - raise AssertionError("unsupported schema " + schema) - - data = '' - loglevel = log.INFO - try: - http.connect() - http.putrequest("POST", url) - http.putheader('Content-type', - 'multipart/form-data; boundary=%s'%boundary) - http.putheader('Content-length', str(len(body))) - http.putheader('Authorization', auth) - http.endheaders() - http.send(body) - except socket.error: - e = sys.exc_info()[1] - self.announce(str(e), log.ERROR) - return - - r = http.getresponse() - if r.status == 200: - self.announce('Server response (%s): %s' % (r.status, r.reason), - log.INFO) - else: - self.announce('Upload failed (%s): %s' % (r.status, r.reason), - log.ERROR) - if self.show_response: - print('-'*75, r.read(), '-'*75) diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload.pyc deleted file mode 100644 index d5bac6121c92fafcd2e430d2587840ea4c5a509c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6669 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 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload_docs.py b/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload_docs.py deleted file mode 100644 index 12bc916bb..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload_docs.py +++ /dev/null @@ -1,203 +0,0 @@ -# -*- coding: utf-8 -*- -"""upload_docs - -Implements a Distutils 'upload_docs' subcommand (upload documentation to -PyPI's pythonhosted.org). -""" - -import os -import socket -import zipfile -import tempfile -import sys -import shutil - -from base64 import standard_b64encode -from pkg_resources import iter_entry_points - -from distutils import log -from distutils.errors import DistutilsOptionError - -try: - from distutils.command.upload import upload -except ImportError: - from setuptools.command.upload import upload - -from setuptools.compat import httplib, urlparse, unicode, iteritems - -_IS_PYTHON3 = sys.version > '3' - -if _IS_PYTHON3: - errors = 'surrogateescape' -else: - errors = 'strict' - - -# This is not just a replacement for byte literals -# but works as a general purpose encoder -def b(s, encoding='utf-8'): - if isinstance(s, unicode): - return s.encode(encoding, errors) - return s - - -class upload_docs(upload): - - 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 - 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: - raise DistutilsOptionError( - "no files found in upload directory '%s'" - % 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) - - def upload_file(self, filename): - f = open(filename, 'rb') - content = f.read() - f.close() - meta = self.distribution.metadata - data = { - ':action': 'doc_upload', - 'name': meta.get_name(), - 'content': (os.path.basename(filename), content), - } - # set up the authentication - credentials = b(self.username + ':' + self.password) - credentials = standard_b64encode(credentials) - if sys.version_info >= (3,): - credentials = credentials.decode('ascii') - auth = "Basic " + credentials - - # Build up the MIME payload for the POST data - boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' - sep_boundary = b('\n--') + b(boundary) - end_boundary = sep_boundary + b('--') - body = [] - for key, values in iteritems(data): - title = '\nContent-Disposition: form-data; name="%s"' % key - # handle multiple entries for the same name - if type(values) != type([]): - values = [values] - for value in values: - if type(value) is tuple: - title += '; filename="%s"' % value[0] - value = value[1] - else: - value = b(value) - body.append(sep_boundary) - body.append(b(title)) - body.append(b("\n\n")) - body.append(value) - if value and value[-1:] == b('\r'): - body.append(b('\n')) # write an extra newline (lurve Macs) - body.append(end_boundary) - body.append(b("\n")) - body = b('').join(body) - - self.announce("Submitting documentation to %s" % (self.repository), - 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 = \ - urlparse(self.repository) - assert not params and not query and not fragments - if schema == 'http': - conn = httplib.HTTPConnection(netloc) - elif schema == 'https': - conn = httplib.HTTPSConnection(netloc) - else: - raise AssertionError("unsupported schema "+schema) - - data = '' - loglevel = log.INFO - try: - conn.connect() - conn.putrequest("POST", url) - conn.putheader('Content-type', - 'multipart/form-data; boundary=%s'%boundary) - conn.putheader('Content-length', str(len(body))) - conn.putheader('Authorization', auth) - conn.endheaders() - conn.send(body) - except socket.error: - e = sys.exc_info()[1] - self.announce(str(e), log.ERROR) - return - - r = conn.getresponse() - if r.status == 200: - self.announce('Server response (%s): %s' % (r.status, r.reason), - log.INFO) - elif r.status == 301: - location = r.getheader('Location') - if location is None: - location = 'https://pythonhosted.org/%s/' % meta.get_name() - self.announce('Upload successful. Visit %s' % location, - log.INFO) - else: - self.announce('Upload failed (%s): %s' % (r.status, r.reason), - log.ERROR) - if self.show_response: - print('-'*75, r.read(), '-'*75) diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload_docs.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/command/upload_docs.pyc deleted file mode 100644 index 7688fe85ab72bb3c900bf630069fd06e65104a61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7529 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 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/compat.py b/PythonEnv/2.7/Lib/site-packages/setuptools/compat.py deleted file mode 100644 index 3a961c0e3..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/compat.py +++ /dev/null @@ -1,97 +0,0 @@ -import sys -import itertools - -if sys.version_info[0] < 3: - PY3 = False - - basestring = basestring - import __builtin__ as builtins - import ConfigParser - from StringIO import StringIO - BytesIO = StringIO - execfile = execfile - func_code = lambda o: o.func_code - func_globals = lambda o: o.func_globals - im_func = lambda o: o.im_func - from htmlentitydefs import name2codepoint - import httplib - from BaseHTTPServer import HTTPServer - from SimpleHTTPServer import SimpleHTTPRequestHandler - from BaseHTTPServer import BaseHTTPRequestHandler - iteritems = lambda o: o.iteritems() - long_type = long - maxsize = sys.maxint - next = lambda o: o.next() - numeric_types = (int, long, float) - reduce = reduce - unichr = unichr - unicode = unicode - from urllib import url2pathname - import urllib2 - from urllib2 import urlopen, HTTPError, URLError, unquote, splituser - from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit - xrange = xrange - filterfalse = itertools.ifilterfalse - - def exec_(code, globs=None, locs=None): - 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""") -else: - PY3 = True - - basestring = str - import builtins - import configparser as ConfigParser - exec_ = eval('exec') - from io import StringIO, BytesIO - func_code = lambda o: o.__code__ - func_globals = lambda o: o.__globals__ - im_func = lambda o: o.__func__ - from html.entities import name2codepoint - import http.client as httplib - from http.server import HTTPServer, SimpleHTTPRequestHandler - from http.server import BaseHTTPRequestHandler - iteritems = lambda o: o.items() - long_type = int - maxsize = sys.maxsize - next = next - numeric_types = (int, float) - from functools import reduce - unichr = chr - unicode = str - from urllib.error import HTTPError, URLError - import urllib.request as urllib2 - from urllib.request import urlopen, url2pathname - from urllib.parse import ( - urlparse, urlunparse, unquote, splituser, urljoin, urlsplit, - urlunsplit, - ) - xrange = range - filterfalse = itertools.filterfalse - - def execfile(fn, globs=None, locs=None): - if globs is None: - globs = globals() - if locs is None: - locs = globs - f = open(fn) - try: - source = f.read() - finally: - f.close() - exec_(compile(source, fn, 'exec'), globs, locs) - - def reraise(tp, value, tb=None): - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/compat.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/compat.pyc deleted file mode 100644 index eb0f2a024d2141764f19f37ab07413966c505f3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5090 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 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/depends.py b/PythonEnv/2.7/Lib/site-packages/setuptools/depends.py deleted file mode 100644 index 8b9d1217b..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/depends.py +++ /dev/null @@ -1,246 +0,0 @@ -from __future__ import generators -import sys, imp, marshal -from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN -from distutils.version import StrictVersion, LooseVersion - -__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 _iter_code(code): - - """Yield '(op,arg)' pair for each operation in code object 'code'""" - - from array import array - from dis import HAVE_ARGUMENT, EXTENDED_ARG - - bytes = array('b',code.co_code) - eof = len(code.co_code) - - ptr = 0 - extended_arg = 0 - - while ptr<eof: - - op = bytes[ptr] - - if op>=HAVE_ARGUMENT: - - arg = bytes[ptr+1] + bytes[ptr+2]*256 + extended_arg - ptr += 3 - - if op==EXTENDED_ARG: - extended_arg = arg * long_type(65536) - continue - - else: - arg = None - ptr += 1 - - yield op,arg - - - - - - - - - - -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 assigment - return None - - name_idx = list(code.co_names).index(symbol) - - STORE_NAME = 90 - STORE_GLOBAL = 97 - LOAD_CONST = 100 - - const = default - - for op, arg in _iter_code(code): - - 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 - -if sys.platform.startswith('java') or sys.platform == 'cli': - # XXX it'd be better to test assertions about bytecode instead... - del extract_constant, get_module_constant - __all__.remove('extract_constant') - __all__.remove('get_module_constant') - - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/depends.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/depends.pyc deleted file mode 100644 index 188b412150548d144d57dd236b6c8be0f6cf1b52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7233 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 J*CFvm=fCLVxIF*> diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/dist.py b/PythonEnv/2.7/Lib/site-packages/setuptools/dist.py deleted file mode 100644 index 018892154..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/dist.py +++ /dev/null @@ -1,892 +0,0 @@ -__all__ = ['Distribution'] - -import re -import sys -from distutils.core import Distribution as _Distribution -from setuptools.depends import Require -from setuptools.command.install import install -from setuptools.command.sdist import sdist -from setuptools.command.install_lib import install_lib -from setuptools.compat import numeric_types, basestring -from distutils.errors import DistutilsOptionError, DistutilsPlatformError -from distutils.errors import DistutilsSetupError -import setuptools, pkg_resources, distutils.core, distutils.dist, distutils.cmd -import os, distutils.log - -def _get_unpatched(cls): - """Protect against re-patching the distutils if reloaded - - Also ensures that no other distutils extension monkeypatched the distutils - first. - """ - while cls.__module__.startswith('setuptools'): - cls, = cls.__bases__ - if not cls.__module__.startswith('distutils'): - raise AssertionError( - "distutils has already been patched by %r" % cls - ) - return cls - -_Distribution = _get_unpatched(_Distribution) - -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""" - assert_string_list(dist,attr,value) - for nsp in value: - if not dist.has_contents_for(nsp): - raise DistutilsSetupError( - "Distribution contains no modules or packages for " + - "namespace package %r" % nsp - ) - if '.' in nsp: - parent = '.'.join(nsp.split('.')[:-1]) - if parent not in value: - 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: - for k,v in value.items(): - if ':' in k: - k,m = k.split(':',1) - if pkg_resources.invalid_marker(m): - raise DistutilsSetupError("Invalid environment marker: "+m) - list(pkg_resources.parse_requirements(v)) - 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 assert_bool(dist, attr, value): - """Verify that value is True, False, 0, or 1""" - if bool(value) != value: - raise DistutilsSetupError( - "%r must be a boolean value (got %r)" % (attr,value) - ) -def check_requirements(dist, attr, value): - """Verify that install_requires is a valid requirements list""" - try: - list(pkg_resources.parse_requirements(value)) - except (TypeError,ValueError): - raise DistutilsSetupError( - "%r must be a string or list of strings " - "containing valid project/version requirement specifiers" % (attr,) - ) -def check_entry_points(dist, attr, value): - """Verify that entry_points map is parseable""" - try: - pkg_resources.EntryPoint.parse_map(value) - except ValueError: - e = sys.exc_info()[1] - raise DistutilsSetupError(e) - -def check_test_suite(dist, attr, value): - if not isinstance(value,basestring): - 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 - ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -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' -- 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. - """ - - _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 = {} - self.require_features = [] - self.features = {} - self.dist_files = [] - self.src_root = attrs and attrs.pop("src_root", None) - self.patch_missing_pkg_info(attrs) - # Make sure we have any eggs needed to interpret 'attrs' - if attrs is not None: - self.dependency_links = attrs.pop('dependency_links', []) - assert_string_list(self,'dependency_links',self.dependency_links) - if attrs and 'setup_requires' in attrs: - self.fetch_build_eggs(attrs.pop('setup_requires')) - for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): - if not hasattr(self,ep.name): - setattr(self,ep.name,None) - _Distribution.__init__(self,attrs) - if isinstance(self.metadata.version, numeric_types): - # Some people apparently take "version number" too literally :) - self.metadata.version = str(self.metadata.version) - - 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""" - from pkg_resources import working_set, parse_requirements - for dist in working_set.resolve( - parse_requirements(requires), installer=self.fetch_build_egg - ): - working_set.add(dist) - - 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 fetch_build_egg(self, req): - """Fetch an egg needed for building""" - - try: - cmd = self._egg_fetcher - cmd.package_index.to_scan = [] - except AttributeError: - from setuptools.command.easy_install import easy_install - dist = self.__class__({'script_args':['easy_install']}) - dist.parse_config_files() - opts = dist.get_option_dict('easy_install') - keep = ( - 'find_links', 'site_dirs', 'index_url', 'optimize', - 'site_dirs', 'allow_hosts' - ) - for key in opts.keys(): - if key not in keep: - del opts[key] # don't use any other settings - if self.dependency_links: - links = self.dependency_links[:] - if 'find_links' in opts: - links = opts['find_links'][1].split() + links - opts['find_links'] = ('setup', links) - cmd = easy_install( - dist, args=["x"], install_dir=os.curdir, exclude_scripts=True, - always_copy=False, build_directory=None, editable=False, - upgrade=False, multi_version=True, no_report=True, user=False - ) - cmd.ensure_finalized() - self._egg_fetcher = cmd - 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 - - go.append(('with-'+name, None, 'include '+descr+incdef)) - go.append(('without-'+name, None, 'exclude '+descr+excdef)) - 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] - - for ep in pkg_resources.iter_entry_points('distutils.commands',command): - 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: - cmdclass = ep.load(False) # don't require extras, we're not running - self.cmdclass[ep.name] = cmdclass - return _Distribution.print_commands(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.exclude(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: - setattr(self,name,old+[item for item in value if item not in old]) - - 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 sys.version_info < (3,) or self.help_commands: - return _Distribution.handle_display_options(self, option_order) - - # Stdout may be StringIO (e.g. in tests) - import io - 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) - - -# Install it throughout the distutils -for module in distutils.dist, distutils.core, distutils.cmd: - module.Distribution = Distribution - - - - - - - - - - - - - - - - - - - - -class Feature: - """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'. - """ - def __init__(self, description, standard=False, available=True, - optional=True, require_features=(), remove=(), **extras - ): - - 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) - ) - - - - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/dist.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/dist.pyc deleted file mode 100644 index 253e4759cd7c4281b3a064a55f333668b2f8d824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33320 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ºBolMS zuMNMgesyKtN(b(&nvMMio3!P7Q-m7twl|btj6YE<+G~u_0kUCTP`F3YKqH;C)uo(8 zHnt>U1-+tI+Ft7WV2CcPID+*@?n<8oD;2gHbfKc<pzW$0v}p}-&|3-$lr<2{&r05y z<}Mu<j=@x6UrK$As;1Rz9Ul!Dcza;!`Xgmed$?%@&s_Ak-amWlX{%-K6jtA;J)ipJ zeF8xv7vQuM#&b5{-SOi`^Dn$!{&q^FcR83wMu<*xGS0OUHf<IyXVWt@aZA5&snqSd zwhqPXbYnb*-<kC6taJ^_OhQ_PVxV?%E6Y~XR82}^Sv+&w^c&;D?-o~knzr587+g&` z-cu;pyBi0Zt})R(1c%$t{oQ;&Y8il!p?W{s+%0WUNGx5TOt+fi4qPs1+@^y=!BF%1 zZyJlSbQ<nlxbf90?@9t0wuV52t<k91n#o<*nqA;tL31}|CpHJOBkKdL3bw{g<8;NJ z6N`hhHMz@Uu_NR#nIEQb9iwU)yX22k>=-HGR<|z!I~j9Uf*Mp}XIUb=4by=Ss?>A0 zPdfgtQn|Xl#~mA&V1^l*c&4CToA7U8GVerv6NJboV?`M5u^62>=T9sy6U~XFjLLZw z#T6Kh5lfg!W<$8;R4Rd72xBbPW7HTNTZvuhw(7Qvz)_O<+5Nm>lsL$ia3x~w(URez zSc}Pep9Cg{jtTtG0gv(;iDl8^&@b5@nd^OHQr*n6ECMV>f}uk#oJOJFMpk6f6IC>` zywWCkr!dYI+6zQlSh0AIPSah#?!xp?DGjUu)7M~F8OWi$QIvJc+NC>m!%hJRr`tzo z1s(jj=q%yHjZHvXCq!vY8MYH<<W4oG8`F*B&10Ub#B@rk`c*F0ZyLfylDcr?H6tLi zFocQ7NRx@)p-8Hr=n3^=m&>P2>%gXfA^CG~8D&<~#hV~K>IE-DdaRz%0*dvIZfWe< z2RBySv#QM{wYfSpUR8I`@pqMe1bb15+EBr{;2{nZrR0<@ri?dkN(T;peFCndyIPNl zOLxU&X^$FQSbHPm+N0|s&LWod3Opb_Lg}3^U*e(9X!W;woc^@#3CW|hl`>mXG)-^) zTPh^$h!_)swYz-?lhNqsgfJ3iZu|tEkjG%S$LuVa=|T~4fEW1`cQ^!|glU5E_DGmP zZXUn9{_&7%&om27l=1jfa7p5v4(5w61oOodEO14P44a?w&v~S}EYk(mll#7s%hkjR zG?)5oOG}oI6#Tr3AV}awkBG_V*;6*C%Ka9e7G|gTnKj;m(6kqPPPZ(JbWI0XyGu1* zZ?wp5b$=rQj+eulztDs^v(mrEjqRJsuh80G(oBl=%FVK;c^ol%tg*w}s$<+$XKfZg z$;tXhg1H(E(eoxw5mnyEgr<>)&@p$$r8Pi!UR~CFnQwuT&jm^@XN*!Y16(+DKlnXc z)ibl=jGG#)Jgk3Q4?fMoIPxkh*UNb=EXUcP{k?$jFVd->5QL?@I`a%30KS$Bz6rW- zQ}0bO3sRmEIC|q8XnXjWqvdi&ie<>iQ3wonVk@dhaT~1_^WMqQqQ3MNhuZkXH%!F% zlG}%8VrV}jDAYVtIxTTaR_XnthZO`D=nFhgSuLLrlBbm26o#+xe`KeuRnn8dGRd5r zQSgUUlEq|gaBDy=p$81j1i+{V9x()%?Ssb8(b|`{Kts5ok5SsEIVt%Yw88Y>!YTA# zyJ@I#94dmY(BGx~l{x)VEF<<Dm)cqhQlzR`>ymtx-|iGGr9K<2hDdP62w?dXiO1?| z#-y8R<AQr|mjGzx)!ii+8$quqD+M-Xfre!;(i&2Y-)nPU)R}l-`tv#nO}3zG`nPqD z&$hVuP00%g6`e<aM>8d1?8dYufi@&K?A0L2H+>XDvAp{A%f|Qsx{QdIOf510Dh?s0 zLh_BNV!Cj+d0$EXL0JiCLsC#~@3YynIn^!cDEm-Q%7sV&1B{iLj;X(5IV56~WrCy+ zauZ?pb4H#<h#C>04yn#nw&kWUyk%L>h3T7J-3a?g6wiNhdYv52nZ#%4;ATx`)=9gr zvJSS!#Fa){y-$Wi^r(|1vZ#C=;fW!J-_OD#;Yw(uqMZD;^7=)euh-uQ$p}8<z~^m- zH1j&^QxZbimQp(u@2{m-g`6DHP}az|Q{Li5pU|u{NyX<iwtD(H*NUs~#J2k=`&DZM z09&4fnpWO{=>uC*ln2R7)c0DXwfRw0DOB}@H-W&1Cm=tamreOZgYYtmE<U3>B)7_z zDto8b{OX-mvdsL*YWWpZba@D46xz%MG@o4@4xj(*^g=tIKF{$p)AvFihGxauBFbkO z49c1Eua-mN-PtYgDvPg&w+lCkMp5NXlic4W)$uM<qfC;-@>DP)EBVE;^Ipd|N61}O z7xd3uT4kg2UK2hI)uqPFMSte7DT@#o?^F>1iy&4@flO(RqvzFa;VkJ_Y3P^5N=y+r zpdjG{HdZH!!BScNuM`xkZs5%HN)?vT$D$ivjAd3XSQrGQ*Z?Dco6e;%z*m%*Vb^lY zbAp|W_35Po66D8YHPW%SRMXv3ja{o6PN=3CtD(jJ9IF|l8e5#C9>B+ZhrVnz;ryuj zWVciqCsa0OPTG>M$?!_wGA+la!o<`Z@Fg&~;GRpL;O%+8@MssO;dYVAg=dyk#gNPs zK$=fva6V!uEu>P%!~5nMTU}gFKf}}Q6+qGI3qASQ!kWYM!j0`_x!6==Zmc?%_*1G< z(q$_AQD6^^Ac&-sHOwL31BIf7IqbNBv*NPtm{Cs6bJP|TuMuuWaq*a(6+`i}p`WFk z=nhGp603uQhS`y7Gg9t?We(KEmSy+&$x45W0yQ)DSGi38u@2ih2kA6T{ucpV=mgMl zGd^0a-qcOg(*7AI(pgc%%xYzK5#T2wZ+KtZO^84X(F6$AW(K(q{azhB!Fo-<6Vaz^ z9l0rTyn7TX)@CS*Ct&_kgkauZw5C`EXie?awK-KVa^vPHHk<jIRag*TCly%O4%+0; zZ<z8$or@N~81ro^eeeaw^kL7a<1~|(XTb`I&~qj}O)_cOfqC&H{FK)TEB7ouw{2EV z7VIrS7M7%F+%YL`j}ydjGRx*j=5<oxd9Y>;!BIz!Sc7f7bl!{GSSbQViUcWv9ok(& z*eUZo@bz<nhQh+@^O`D6TwJte>xI4au&s9_LQ<JbHK`#&^5HyT@37xBSEO{W?PCYx zVXepyB-Q>vc=-r-Wv#Pi5=-9?;d>ctJcQFuy6MCNF!kS2e0wkzhu-HZ1e8P~SUAAJ zW2hMD<frb(-Dheq`8+d8DB{f?alKpN7b4>R0ys~-4@TQ4+5hNhtANh8LECM`*7Vot z%pVC$(|@Wr-sG@t=$ZZlTHA{TW4p|_v8@=X@U!ksjdeg<vz4~hUix7OH|Q1KWU@6K zn;1;A6uxUlQ*b8BZYnd0O{d+GP5hRY6H5C_mJKaV8kHL*99PNXQu`yjE~PT~AIuFU zGD~?6c15Toq-EP$gVKPA_1ChZx2RuORa8cefh(0u%ox;nWVG3P=C88ZD6O1739HTb zNr1At|G!PQFvjnh=@#1e>v=2FE#Cg)m~L@Me-fsf)n!xp|1jNRqYpIQ(q9+P5@Ybr zxR2><PKR?Ge260~2jF^pthL{up=mKTv(~0IS!>Z^GbQl->Y}N2LAaf)l)&1CKomlE zLztn9n<ow>P%fXYvZPeue4!CX^83zIr&;r+Nw=v<i!<tw6c%kP^EJM`*HaP6^jCDr zXIo(C^AqFD$C15HK$Rw@{8@AtzqzNNJkG~J`um)Cn?(jB`i~uN0y#5>u|&};P_wm3 zkIGqy2w<Ws$N|SqRAz!qf5CL#F?akr3O8v>gc6y6G50(=GjJ!F$!8yFLMEhtFej>c z+?}o(xP6|SxSf{LZnMl2Iq%4Dr{zgir<Q#pJE?Xg0AOliB7Z~MJA@o0>!UA8$o)C) zQb<buH)Ka&mU+GlG!Rtg&BtmuPd=`;;kDc#pQt0XuZ&g^l4kpYLis>`8w2xEhR3#2 zE`5XYem%us<}Cdg9ez@Wzrw-d&&6^-TlYJx$@cOg6oo61B5Xuj#>SKok}6nKIb3X; zHg7cx4Xu1`O{RZe1^)#H!$b1ltt}f*`Y&}`w9ZOd5}77BBb4ToW3~-7(|<*?9}y-_ zb0SUp0H!rZ{JT3zB{|yI-#mggqg?L2jh#)?UiMIOCm+Mn8T1*Zid2&IM=Vaw9AlZu zJ2Tl3zL|};{!JlBeDJ&G4<5IpM@LH+kqhUtyM505D>zNe3<O1GCW5adlYq|nZhkKy zyD$)xvq&dC7qFLRg^;@((Q;6S3=!~<-hqddY^-0iXQ6wu*8Zfs$I1)-eBEDhuXBg= zxLqQXOSiw`_`AyNfW%ZGYxIb9Wv6vzN5dBs=30QBR2I6WCLy75;(O=Z)!Roc5#_RF z9Tm#}Ecg*v-T7JO{Cx6R(CR$y%6s=vRobhzqzg4A;PBb{!r{s>{EDq4Hg%22yeT7n zTU_Vk5cnQs6$T@~{HSbGXTDq(8?(3-b*9vINWjvDo-DsCSOk}_5>(5HQ3+XjuGNwS z>+qwqSUMK{)!O#%Fe?T#ETeAUs+I%tP9()-Hk(_T(^_Y?TgXN;wyF{hjiG8~a|le; zoZa)~+C$$0+lTqx4QyetPZJBvLp5TpgJ(sbQd`)?AaGdpFsYULcRwd!W?Z_=K_{LG z6bd+AwuR#w3ud$h$8mTQuTJER4<Q@jy~RZ$>j{0d+=djk?4Q=7+^o6vjOM5GRP14G zm4#PX#XW5QTXW7~&WHS)S+(RjimZih`UPG81P9|IG@JgLcmXJ_Uhs&<j9-#}WBEd3 zl;PaoSsj`$VteGB_@+T&r7P4elZ3=)jJ55aXr5?3&N`8a=0T3)H^+^`D9L75^8oiI zn~!;JBcO@fbodls<gk9i=pRl?Zt6IEW>1K`ziPXRhQ|%J%2x6_{9_YmJcbz8TlRL- zt^SZ``ofKQ`JjLi{0X%Lvdwdyi*+FvcPN!xtP4J67C4**i3=;pe@p~UNGjoh=zrYN z!hA@hQICrcaCohku_1wsjwtxw%AyFAEGn!8vutwx!pz<`ZTovFt?4d)e=zAY=|9xr zAL(FT9?2H-Qu&N42~`rhY#Vg1FIjGukc3rp>F=ntE^rF_7bdv~dAW<j?UP9Vgl7Mm zFh!AYH^zDa61epNOGv~zpoB&qTSB9PkuUNo-UFR5EzCyW@)+U42pf3wEgrrj%y|AT zjnD^!@h&pem%}?uF0&5<=QYFzg?8z2k=^%#FM+;es|d6`l@zQWdFyh*8mpBgM6gNc zWL}fzjj;P=B_6K+in=YG%op2l63x00?vQHD=%~lkGlbe3Ru4-IKSNUXmJumP>IYDN z8|1wI?N3njvS}~HZv#Z)fa3ZDrgX41>n!B<xqrztILRWPjkDS>W;$j<mW+1x?Ahh4 zzj`)sM%xHiass>C7McpB^?H2ql-3igKzO07Nc`eVSz09&U1tFVUQI3R3@K=q{~$N~ zvq{G8tQ69nvX(_{*;<JK(;Vk}!fs2(TpKN(eJ{igHy$m%*OV}J$9m@JLfm$@t!uKv zW-wH5*#3oj!>`474}~o^Eu>Kqb6Xr*^i80M8e`#ANg=a$3Tq*)KvCz4t~c~FD`r=W zx}=0!MOPrki?3YGm5Z7C?D0WoC>fr9NUf`Qrr)3Nn`Kh1{qBU%0^QF;W4{Y)Yzn5| zu(0xEo3}g5wd_n0k(XpGb^~K0K@BYZT^+um!|!nja^<e-OaD7JwvQitoz{L%{NNp& zxQV^Zhw-9mh2hk=KU2c<Uc9|eU_~9~dwy0~w+5}2#Z*{isWI9ZT3S%UjgN36eMN`M zI<$4b7V-Howr0uJlK3pPLJu+>O!NOmo&B^9mcQ{!I{T^)U(;b)hhNu0KEd=ibol2w zNYzgNgAQVGsm4`7(atP&;=A`N6DcjapXF0%h9_Q_XihXI_w7A4xpQ)Sa@XY4WHNbb z^5Ep&$vs?;b38hEjO#<;`xH+P84zFgDOVlUr+-4j5AxwRNWe#S@`LqqY`SdBe(eP@ ziPS_HZ@ACzuzdm96p#Yk9J3S4`qmv=*P@e2CdP2IIJ$>a4`mggA4SJqT|i1p^;=n? zxkVMw=Q{bFpU!EkwfH+Gq3d2@_L~oF+G*qdOp$VjubEonbl3!i?S^tT)mdI++Xr|M ztWLjyQ7aca9FmAg;ixi3q-ol22}pb+Vz^~dXwNji>4K+86wv-^`J_~pXGmNdblE7> zdO|Ex%upF3<+ec5uY>Y$%5%^yL-t8+^Pad%6g`hjdFvKYuTXE!j(7LBAaPK#-Ksr0 zRPk*^quP<vn?YXR{m2i~_QdNgR#mkzUSxxmLx_1;A=`?<jY2v|99fKq$*`~mATt%X z!cJKI?AyYtEEV>5v90oKE203Js(-9H*}RR`6+r)>o@h-<ts{Q8vVYjn?m_d0H`>N* z-b6xs7T5FJF=-1obLRq?T2E@*OPv9u<n*P$CK$8bO>H4V+#=9t|5P=Z*xZCfn>yoj zC52bD{hl^$o>=AcRBI$=%1y{JjLr&gJ(9;gsHATA2@msJ_3AsD@GW2tFU8a~c18RS zHmxLG%sl2{WqH*FV=-ZGF?0Dtx+P+25^b9-|5}~yK+p?*=Pf0vRrT49Lr?<AM@jNS zs6|$3G{R?6zdIq*<Tsb|EUw(!tg46HtSn~fSE#YceyB*m$6xLPgnA)1<@Y@zC(Q#P zS}RI;VzmC{%3)CA;ikq6p|`-|G=zM*gcjqyXnJNfh)CF{dqq`FSO}t(js!8Yr2$Te zt`U9xQMS$qst}Mm9P`(#*Yzp&keu%1!=hj-#%cIcU6!y#odWN*-H1feY}5cr;jFQR zxJ0kQL>pFkz|d1HJfpf$2!RzrSPixA%-DqOqQp7_Q5N5Q0Du>4-l{5M(5&1hN(zV> zkD+C4ZAnG(7g{X&z@Wu+SZOU}s(M$41leg}8`N?`*ko~S;CBqwWUzS!i4J&OeD+=3 zQYi^k9JlE(vMXu(zBEkpTNUhPLGrA^Yh|)t)hmsv-ZO;<1MMjxLvO{1pRRqRkDQFq z|Ei)mZPt6g@I=swD#ICYT<IHr^IYabQ6|kpxknQlR#mliY^yf)mpsq#lR0FGwx`cb zFHGN<5f*mZi1*U$PiESow+r^Pw)LZOE@ADo70B!@sEdqIEP;GTT0cIdK-n*p_-OMR zKtpCqq94YAwAplUCh|~mVBZF3v}Z_YgW5VZ0N@osAEdtDEEMlp+x8bW<f%`J5K1hZ z<*(lCGDn_qHKUTa-D6A+ML>HZ@__Q2KvIYv-DMj-pGCtuUC(gh%-Qeq(KcfPr~S`U zZAK3D!xNSk;(8<~8TBx?k;Vzv6o*X-u?Zsk^OUFL(Y!ZY<5vv)24Cg}G<48rg%W^l z>g$L4LZRJPqg;+Jcrj|btH$nc4e-_hsBO`Px2%7RPQJ~}>ZYN2sXO?FJ90AZ<|9v! z44OheC8(S$!WNw12=Fl@iw-GTgcpE2KK`~t(FZI-va{s$dPxof;&k$O+2T+xFWh)k z{&Yp_IO1NX981o2S<aNLJ;MjFL`x4WTHK9A?<y{YUp*)1krOinv=UtvPsEDf)VVs~ zSB2sap{qFa&As2^wFxph|Bu?TubuXV;}j=GaLnT*Q4nzqNX)0N2_E!~CFi#NcA|V1 zqY&fh6-`ts!WP=tL_rA1lFUU!RVF1@tdySfKHD$Spii#~>bb>rO0_cm8$35l-*)jz z<!`W_nq}?@Gd-f4a=ul8rBwB%f1txRb+BqQ!t@Vy&>I9@$&MuzP9A~EuKaGBlx^C3 z8xZ&Lqj4>i)PFWy7<;lg+n8|sh$-m@s3x07u+KZ{r9SHCi+qYH4$L&(^Pz1_h1)Ky zba|2|-YpNw!?YtA)paj6nhQGj`+aoRz#~AJ7sq_)+Xsv<(eC>M42>>qJHutQoaG7^ zez0sx$BgORBDgVgk;kkT^U>UK_ane+{V^*g3S;XTXqe~bD+K8qx8GM^6!9p4eaU{J zvxJq{Mvv{41ONBCy!*&Wkbp4EIv=XSORup#BRk_JY!R5};&3(z;`1`bEyZ6#4#yNM zldXZP&9#TzGowk{I+qf2s~m^@nvgJdZgqQBYmG9;A*<imEoHP*b#2c{nuvq+nge+_ zrGlK$U4D{Mv7u7^B^dNH(3f@|fYCi;+hA{5p5qNYN=0W{NSrjp+C>eX7Qd=9qf{fq zU*fX1UgtQMMv&XMc=_jP^LZhkd|ht0e)8?m_!LRf9bw}pG<<;@!XuB24Z|~!iuv<y z{fU5<HG~5pjmtJ}znyelbG3(6cu(JtbHFZ&ST7a7XZUqRY$IURmc=5bLYQ{cK}E~F zW}uK^;4;Alqs`I%{$kSaOHCpaD#-I?n<x7v+IDdZ6|QFFMMVs}UtzbzJA_Y5S_s)c z<{LC5GB*A-rezBfrElsUAAk66bMwDTLsx`DLUgx#ig-&6f8^$Skx%h52eupZob1Al zcSXJgLo+lXR|r9bw@)Puceu}H4oAJ9zP;P=S6j`c6!TYWzc(5={R&~_g3RXuYBY>T z_Aw4|8LJOQsrq~~^MQke%}DF7Bscvp*TT7|d4!Hmj)y!-l^GcV6XvdhRb9lzs9$Wg z#b$mx5wD1ftwoi(TBu};yikZMhe$B)#S+0OqPD$qE8}zCKnw9d<A-9=>>kF@6~U(^ zu&i#YZ5oW3I+dALj+}1a$HW<|Sa^wv4`k(~y%ss8?{9E~nfV^+q^v0ZrgWQRfLwv| zdKW9qH<j!pnmImMgC(3khTFaVgQDgW7`6(GGTR{fNn~(D)2nXh`u&|xvi^4*MD;4t zw9ced8T<a;QrTap8&E??soOh6Op~AbZB}IN6~F(f-in#0|4Rp3*=@N=ZCy&&@M}dy zw5jT>RlwDE`!}mo{r1n-o3x`q)5KE>-5-3ExB)SP*>l_q@fH{-@s<y8!vagTE?v0c zH}zCriNz&+nCu|MaN~yG0-y7HOcbUkj~?0lED$KG_smP1(i1n*5{BCQv5furdny?? zvK?8f7GjCGyA!_$p9*U%XK!;&>~ZFI<rE+EdzhBP@Ig4gfLFZJqnd0pzbyhW48J13 z8oACa$XDGWhr@4cq{R-^ZBk0phg8*n)ZvT{zovuoR?<WV&3yWl4$tWDE*;*d!?QXl zGcy(AuJ$!Duzx|fen$sQ<@REa8A;E1#`lA;e^>k<he;AY_9AlP|Dz<JO*NitJlvez lzqh%!Nla?j<U>TNCMG928=pKddFtr5+_&7^<Bfes{x4`LItBm$ diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/extension.py b/PythonEnv/2.7/Lib/site-packages/setuptools/extension.py deleted file mode 100644 index d7892d3d9..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/extension.py +++ /dev/null @@ -1,46 +0,0 @@ -import sys -import distutils.core -import distutils.extension - -from setuptools.dist import _get_unpatched - -_Extension = _get_unpatched(distutils.core.Extension) - -def have_pyrex(): - """ - Return True if Cython or Pyrex can be imported. - """ - pyrex_impls = 'Cython.Distutils.build_ext', 'Pyrex.Distutils.build_ext' - for pyrex_impl in pyrex_impls: - try: - # from (pyrex_impl) import build_ext - __import__(pyrex_impl, fromlist=['build_ext']).build_ext - return True - except Exception: - pass - return False - - -class Extension(_Extension): - """Extension that uses '.c' files in place of '.pyx' files""" - - def __init__(self, *args, **kw): - _Extension.__init__(self, *args, **kw) - if not have_pyrex(): - self._convert_pyx_sources_to_c() - - def _convert_pyx_sources_to_c(self): - "convert .pyx extensions to .c" - def pyx_to_c(source): - if source.endswith('.pyx'): - source = source[:-4] + '.c' - return source - self.sources = list(map(pyx_to_c, self.sources)) - -class Library(Extension): - """Just like a regular Extension, but built as a library instead""" - -distutils.core.Extension = Extension -distutils.extension.Extension = Extension -if 'distutils.command.build_ext' in sys.modules: - sys.modules['distutils.command.build_ext'].Extension = Extension diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/extension.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/extension.pyc deleted file mode 100644 index edbed10dc93de226c5605e8f8c896772c92766aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2585 zcmc&$&2A$_5Uw8oXA_cTr7Q~qwGh%8iTJRW1q5i>BpeWgWsH=?G8&C%+RixR88h9J zwWaJSoOv4#ybo`{6$!qoaV9x%Lkf<oTwUE=U0wB6bsB%}Y)uaS_&%b|r-9#RAp1L5 zjIW}UXjIFJM&7l)aV>k4HfhnKQHzvmk@0BWrg?|1u)0fegMNXD9>q;EU79M2TdcVv z`f=2uxJ{-b+D@(AVpU}(fKbWz2y)ydLp0x}^EMT~$&?JCe}w5wJRbIY@ILt)pOe0V z=-vPeX2u0&whUc#W@5Rq2Xz~C2(sUT!L!#yt7mjcboA55^jgvSJ#s{s@Vdb_m?>OK z%@rx<(eU)=9csD;oo`WbL`o@)UxH3ulZJgZZ9f6q()jqsl|`n1C`zM~sXko0vpmyz zp<k>Ev(izR=?P{Q%e-(V9>^a1Hg;Dl2S<r@rAtyfn3PEx2WI8$BTUQof17n(%ub7Z zkz%LgkklLdeDnWgyx)Qaw*?jimCr%ovsK)jh%YH89<L&^bV;5$UjJ2?S|ew>dl)YH z;=DVxV(Dhw$1Dl60i^iT@hov?<z#%CWM8J!!o;_vNs^6^%%q%+Ur0=kvy1VQ!PD_K z$z*I3XAYKObRN!(9b2Se>GC|aV?@tn7LE;;YdQQZyfA@yz>%_h>_M}wc2vXLS6%#e z)#gT<je;Ov#Rz*2vKkEN904ofs1wDA9sxI=2u<>b{RXdm3U++$fp%x1)1@_5KORJn z^)yK#CYfHQVPteZg?hPOZ6+c<j*W1fzXRC=FhCTT1Zn})OOJl7@Og#V4_P~JaJeZi z4+1dR#7UnGR2i&Y5y&8+S>ljR4uoTf1yP<|n8G1GtH9=E5g8k}Jc#5rl5uO&sR&^) zvnUOs^H+D9MSmNIz5}vcccdPuo|0g(Gkn)WkY%5$yr8xbHHUaf;N~7(;VW{0+@ZRw zT)m4OoBM0dgRY@twafJ&l0!J8e9#bNKLF#X%TX{{Xdc3(MiY664ueEMF_aXXSayyr zCx4-1S++8Ws=n2QY_izC0{SbB^c2a!-9}fC!RhC;zYn)IQQlSe)yWMEq}4Dw7va)% zcv*!ODSDsVu>Sz;ZhiN6aHIxFq{-_wtM0|o4T3COm>}4+vPB-3DG%BAAc*q_b-=(9 z8#iu?bQitJ=N9`GNaEdAZLil7=g{4XuvkZ!k`Dv$ImmL5Z+9W|9G<hEgMD3Er_<!z z=uj7CR;FR0>*D`NPf7<$Ql~?U6=`(@T9I`oj3vwdLzwZ|A)h<L{}B;>6Zu@Jl(w>5 z^Ktz+M)_h9X7SA<+2`!zjmCzxmHz~8FD|Ngs#ZCMXFVF!weEJ=K>dCUc!>{H_1;B! zVI)&NziZMseRfk`j2jyastRG!hi*mhE}$eO{8@GW7XpcW__M9>=k0lKdcEEKz5ND{ Gchx_Y(T1%6 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/gui-32.exe b/PythonEnv/2.7/Lib/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/PythonEnv/2.7/Lib/site-packages/setuptools/gui-64.exe b/PythonEnv/2.7/Lib/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/PythonEnv/2.7/Lib/site-packages/setuptools/gui-arm-32.exe b/PythonEnv/2.7/Lib/site-packages/setuptools/gui-arm-32.exe deleted file mode 100644 index 537aff3774ecd62f4c26c55d0cc12f85c8a20a1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69120 zcmeFa3tSXOx;I?ib75cx7y)%aG!27_4B!Y}P%w_8H0t0bUa}@JYa?PBFMxnq6SE0w zk|lQ{ZWcweY|NgcG1<eY$&o}iZj#;2p3R;!BgwAOsFRp1CS-RTVloW_GvB|uXAqO@ z<@>$w_nz;4--TcGQ(aYE_0;{Tr~Xy5`1U5EA%tjQLLov<g3>>S^87mwhLE_MUX3Fs zqJNimk}3UN+Dfsqj;pDyzN@xu3s+uNRaITjt*hW_w^ebKRowigE4VGy>nn0&V`DPH zQNK4Mw&>|w%c~<M{;TJ!e~9;0&4;U-75cL<eW`k<^8TXo{`9Tus-MIAc!b*n`bv|# zx=Eoggz3L2ba`dDNaOx%IayXr$Xkq_6cyibOC*esq%%gwh|IwyNp=0rXizf@N8cT) zoh3w1@W5Y$k{Z0w!o;73ICd%l>38&Fg$@zwNVHZ$il}87AwHBRjrwi+9{Cdpkzn_5 zgcL;F{t=4s?SCU&Zhgh}diZCX@SuFryoULPP5I*p5prwSm(`aMvRMx&I1mF&0?e>K z2e{5vgOO#lIP5T#roasQa}aVSw?+-9<Pi=^xYS{RV1=_Ix3;df9CoElmcc^f8wWG& z&!L2?*j$Z(rPN=5p?Tn7hW$ARaSnU^r*&8f<a{c*VtXw{9Z#fR4(j<jaxT@``=I7b zuS3J6jS*W)qWGm!di1@iB#mT{+y<F6O}e;LT4R8TEC0?K8{=iB#QV~1CNG&3bup1& zX3@w@_iksvyWB$3Sebc@_()p$oy^n|PP`R<e1S|dTwIfp$fvoLu&!`e>n_B-qNad9 zeN}oa=hK=6vArfEkscm=sn@c&sgH1RypGrKi`;9{nEc6Ej2G#oHp87{edTrbW@y2) zcK%V)oFP7VRQm#ZB$IC|IoM~g6Waps!9KHnjcvZ?+rrrqPJ5V0#e>?TV=T9i+tWu7 zmUx+2)JC{9wkVJG$fHher@1DfkD0y3CL=wEk{)TY@fjjb?XAOYCD%)C>9t)owDjIO z0$Z&XrJFj)@hIuVM4B{s`f5$%H^b79lXx0dKNL1m2}?-Mr}EO+Ud|ZLlONF#e;J5; zuT^S^SPKPbZ=+IgyZAFQaf}i7_7O6HC*zk&#L!Z*%nko2lu;BjmHHHdJCaFr(ijcb z=*ZWg4BnYFTv8vi<MrcX!~(vh#OyxVL*i|oHIq@_)2?=<Pd0f+N=&@LOWj%TQi(Az zKAIAlxW!!Tu1#K(md~Sx#x$cP+?`CuN8*j7LnfmIk#{_Lnb~osE8@F`o9)i$Ym@P% zG4dtZPpk-4m?$#&iNYe;D*VMwb6`Xc3fyXL-j|7;=Ev`ak3A9_O@Y`VDL&&}hPEX? zr9NqyN+{D*w6T=~FZCL7oV`RTzeo9<{1|cRwT4>u2;o{vShS591MJZ^EbLJ-VZYPx zKKmkV8M!u%XH*R{>p7?Y9DCH+YaT(%ZB)(e;}T?M4zUHiBfvGW(N^E*MJ#DViW<=I z?LDD67L<E~k{WF#&R$NjJ9|@=IM^4)hz{h3<zm4Xk<0_=6HhtOmKtg^QTyit&ZBQx zsO^2&m_jE1kW+t__JtI8Ocvvb&H57YXDe|z53}jxYKW9FAfN@<6Tl;zC_0;0i1V78 z#re&NJD!k}rd0B=Up`b5^8Yrd<1<C}NXUP4FpB?m$G35rC8G5!ao@=0=>X-DJgZI9 zcSmbh4~-)<hYfrIAM(FF__mBGq(`e|a-%P5r!hCLlC{Q=|J2}oQ08VoN-5-jS$XT| zVd9M!V|ui@BRz~>4R?4b9I?(tj8=h2>jU4$qqBFt!r?5`<nWT*r1Cg40*3qpKff%S z&U_$~GeWV(TT=oryMq{B-qn6tPF380Cu`4KmXpGEa)wCD`+}D+)gT-VoAYTA#wxRM z!~!BE_Q$(o7n@4Qh*@JZ#7$*3J}I9xN4ZA!7?@1((pHjLMl#v+298M4{im-MH3lzb z=Q&6w=O7lul?nS+3yo7=NXO-Be(ax@&ACk^6E4d|J753ej;B^%C6iM+7F;EX1mh5O zNpU~wBp#`YnNYmgCQ=v1ruE*06wdV(lqUI9w@n?4mHOF)Sqo=^)8F@z%)fX-T!ApT zbg3`5l(AkZi+mmBoxCs?Vg93!4S#cM2mO|$(bUzn`;@e;NO7K<w!}a8ac+{%rV-AD z`d%ldy2gkp!aDIMA}5CYu25Uq6>&_*NVuZcidQNVJL1FkSYLdp>T4S2YY5xhDv7T^ zM8AE+{4&EEMT<zJ&-%=#gO{eF%nHKgW(QpWQ;PCy2R#XM3g#Uc2i%Haay}&sy7{RK zi@#c&ZftCJCVGFn={J@baenWz75kkgZ_HzkUSr~ZXO!1f9cR<N@0G9Gjcz6#^H=(K z7sI6pR)r_dRV@)h^D)+C5yrqIyHdo_@JkVrU`tSJM5>dC)Y=z^w=o??SIh$XMHJqS zqyKBY+M!qocls(pJ6H`~&1eJrQXFI@>?YU+(5c{k4X7P-KFk7`B)l(!$v_y0LE*d+ zsiH6B|1e17gZz1d<pOA@jA(Yni2I%KUSp*e^Yo%hqier2#$&)U%A?0q>(SuJcnF8~ zFFn?Q*6rBGr0bfK(_lE5^13ZPwfr<_7Y!I`RGvQ>P1Clc{Tqx?F8$)vvD*BjPTkp+ zvbIp;ZYg=u+1Gjcs=aX_%|T?Ce<Z9n9eIL@gpDh;in}{ZE^Qje(K0l+bm&PfB{~-; zScKRP3&;A1)h1A$>?p@b`D{k{(DKUpGz9)Q^d%k7EwL*t6KznS<FMA7$)})BT1u=w z+9#9y>|&DgULYiva^eWZzFo-VX+5@-%o;lrZQay&QYa9k6&Jg(U8J?zQo;#D(#j`A zZ9B%nM)S)wzCqc1n%0#WhVoT2#1n0cA-_9h?x3v+ZA>XqjM^rQ&?byWlC!sHnEml# z_W470wh^t_8mYTCH>Ipjwy5p-tD*MX<7H^Q4wdJdn@C2ArTNkK8e1)iJr=Uc{f79o zQ`5OyY_;rj>N}aKnf4c**E-emq-9FKJ*kXw)sRmdy+j8db(!G*b?{Fxh9vsR#?bfQ zh2M?7c^eZYvJ}z+NAp%7ppIapJ^5s#MobZv78mxdDbZnV;Os3O$`@^kk@|0J=Sqon z++wy_(`*%wI<4Lm7kikNxMn}wy23%4)lr4C&Vya8G140KG<`#>Q9|nWYg=!35SUH; z3dd0=@#<VwL9^(>yhOo(`l9WIj^|7N=y=V9I<mkRV6-qx;6}%J%qc_sIeW!n_WEJ= z?ZfQ%4YM~5v+o^dZy9DkFwEXI%>Mk4eP{c;UJ`jb^HR6T^gGO4H6;;O(n@Etm%25Y z@?w;IdrgUjH^01@|D4a3qD-Hlh8hQc3Mt6!pyf;3;DyRDV!otdm#t2OJjZwvQ&w9- z{%r$HxIG?@q()omKmYy@D*?$$NN_wMS7H7W=I1a!gRx9dGwOt*rW8hm*$(qC%#$!J zFl{i?VSWX37UmMn=P*H-1jLaElLvD%%yO8!VIG8e66P70=V3Atb{tF+%t@Fmq?-p* z1T!CI3CwDkbuf{?;*pMsmHcUxgB+yt5=`VTqRV07PzAF+4JJ|bjrc{>9#`Ra6@CTi z-;FRib>+2{HTAhQ_k54cQx#a%H5FCd__`QkMObTE%{}#EbyaS~_6izfILwC1s`cD5 z#fO7W`L_D9b(<@cuMnns+vfEg)rC<nIO4nIE9S5G>fblS3EzF!b$s-XKjqR^y+Qe% zH*3wRx{BJmHQVr9v%b1~+m?!|`nolDSJrJS+sxI~Z(Cnk&E?sr<gHm&TfMQO9DbY2 zwpEpj2tIfD;x)@FHdmC@RSY>o;j)f0ia%Ne;bKtUhd)L@3&j4(5PB3d)vpJR$WR56 zgUOH`Ko5;1WcMgSUV`}n4E@v4@CZ~$+S7kMa5xk?EQKQB6Y<?rm^)x1e-o8>51$+! z?=<L#w!nNZOljC35cAwE#AnzI^QrzSGjO;jbd|vaeuHBO`7}hel(3VgDJzLD>R(~{ zV6N^$*vkldIi!SpAK^@-!E7WxmI)1p;>a0lC(K}oz@0M?pXRN1LvOX22SX0@fykd8 zZIEzKB@J`C9c~=lzU}XSxBhbvTT)TKxO)Az%@us*=87d{TPo%f;woOgq_{LcFL(Xs z&4j$7tE{W5DJ!oa)w=Ss&5C}liCMe0vU=Ux4QOhF%+##iQnsn0rmS8hPwF<*)K*s2 zZy-6^wRJU{E9(_!vUtU<^OjGUVprpQ65rodQNN|EvZ}21t~zp_SzETH?yj{J+bf}l zyjQ2v9%gO1YMaTbUU%ZVd5E^6ymCWj`C758YW?PlT0%~<Yb&cN>+36Ox2&xor>?(| zrzofJs;Ih~+{Ub3U0zd<oFX831wM5Z^=r#&YSz}@Q-l6{QgxwyZ42^JQHz)fySBW# zYD48+^<r&B*?Q!@Y;y%!$*$c%b=T06gU9MEs(mIihjM^C)mJzix6NI>`gXD#ahBKC zuc)YBRi(1KzIc0iMNNHWbyb)VA|Vc?U};F=(X6emQnH<;S&Q^Gk%tinsv_+Agm&$= zD#g8!DXuC97t5+q;K<P^W`4!+_bJ+2wpG;Lv#g?aLp5?#RbGLyM+rHR*899|wY3;c zRw@}=xSo(6>bl~dy84POD=X0w>S&vwHWH_S&&ta3O-cmQrxNl<&01O>WDvY>uC7B# zc)>TuMly}oRYm#T7+v&r^|hPfL`G9vRe8-lWRz;#QuA%y=bvu>%_Tr(TX*v7^D$h8 z=vW^NkFWpDZ2dF&|3xLhm<gFuHjV59ZAvHP2n2zjuA4qMn1Im{@5z|^4WPxK-xszH z?gKUBoyr1Z1vBI?LS~oEA#{IiyfBAc1TBDnjzxVh23;sjflf=M2SK;s{S#0J!ciGv zB;vUTbPB%z6X-VhPl8M!!v7%XMKXnTWA6U|@4o@P3i=7?HBc%OEW~&J{QI9#0t`X5 zP}6W@Y>XlY+P}p;T1&_R1QwQ|eb52qYkx&^wr|<Y-3^Hr)8FigQ*!MSxe7XmRaV_K zd*Z5<d``hcNVS;O%jk4Bd*VG6bra{@92-+qR##WCW!>g`I7CoYH+$l?+NxP~5OcSb z)#YrdEU&GutKLwbgQ<8{S>2Z0yQfU#FyU2hsHm&Ib$DusisOpvYq!<aFRa>79gZ#i z@5Gj$u6&0t>mbb6R@UDWeuqnK#nx>|rDFZE+RD2zU*1(wH{?0oyI5HVAls!CcUNrY zHq+<qiDh*QtM0DeR8c#T+g3TZyu6|gdD~F7xvpX&H+d+YqRD?fm7>Wv@KiK;D0BF{ zXmX_7@ba~~_|{kS`w!reRP%O?R8z2Z$<}+fzPk0Dt)FjYYh!8?YB$!_);8AuzV_o< zQ{AGvd+Q#qd$R6)-Jk2Y`t17Y^=s<is`u2Nt52F%G|e&X!D)@t9-r1UZSS;G)6YzQ zYx>*M-<j^2{_ga1(?6K*oBr|itJ5E!(KKW4jFuS(X0*+Ce#YS$FV1M6abm{F8K-8P zneo;PM}b(dxnOTWOToJZ=L$Y3@D;3|DbCzHvu0-f%%*z|+;jMz6ZcHL_wjp8g-L~$ z!qh^pFtadwN5PKyJC^NOvqRibzoTKt<2zb*Jip`Ej<<Jk_YqFrzCU3<V}Hy3w%str zH04{%;Gd5FEP?+^OJMQ;0RBfpnf;IAf2My(@@pHagzKhSNXPrHihn9>1^t{mBHRu7 zO7TyG?<llQ&?@whupM+2-zL;4^f`r6ybq1*uT`gt_tBB%4Qp<Rgc-v7?1zh}x^97N zq2OZL>AOR<v)6GxLwFxMCOyo7^pE`q@IJn?(0QrB)u)*uV$?7P4)N)Rz5k<D@R|B8 z^Kazy2;S#f3tTYfV^4jE??@O9(|82$Gk+3XY2LG7o`o6q=Rko(@IDzfc=%vwoNvPn z`*RG#`zU!tUKRY%xnY4|ML6JnR2<JP0~}}>(8<dOGwjdtPaMy%()gca#Xj>qiv5Wl zP_aJ@FbeSl{~eegc{jzlJgVSdeihJykKYD}^*?~?*s0)IDB>f6W+Bp)0ecwvK_uG% z#jybEVO*0&F)QCWUVt2N11e@EJ&akA{tjkk2zT<@5blH`RG9Y^go?LoP1;b1Axw*k zOF0i7nS9FWLfI<(tAb4-k}q(b!}9^kAw{Op7>VtucY%ULQJ=I9M)QyG4d8lV;Nete za?HhOU?jdj4!fv8r_2fLPX2BxGu!WF((DK`C*bN`tztWr(z+aQz%@J2z%!GR>6g0u z#{n;4bM>xKLTS6vsib!Ta5E9f5+L0MO=1u5IyZNFIm*Xw^=W^ZNd7<sZDsl!Xe)}c zieRkJUIr=3>cVR(#%hM=x-SR5$RNd5UF`qIu~nq$t-};iWy9CegG?I5QW5E`{_9w( z-}gtbR7V5$(~%Iz`>!LYemN9kKSE&GdAX)z$yW{K*tgVJM7!G+#`+KiJ;iW_)6`%X zd->UR;H#{r!}HTgn!ef49Niq#Y-}ddy94vBre;^KK|$)w?fsNPTtvml8IJ0jO-HrO zX}qgftK!0}nr60{0Tzw1l4fEh>4a-5S=~XT+&)*Ypwx@QPNYBd5pG<&`80T2hxpi- zRznN+gPBCZ)oUKY2f2DpirvtnKSK9CX*@BA=f0tMj)&vXx6s(=eyy|=xFOW0A;;C5 zq<l^GJcfPqT|7k*T}L*V`&nR#D6;7QMK--eTPa00O{igtUR01xuHNUBbZ#Fvq2{k4 zoAgpUkVAAw-RvdODcRNAu6)D3Ky$giFM?$11m@*Bk||2^_o+xGy>xEyuOXRSy=RoT zB1ooUAemgfZ~YY{6LUmGGMyWYAeowhWcmS0Y%92WSBWVLm>{~>AK|J|;fhg^OEJ;W zJ(z!_$NN;wQq^C<EUg>DB2moJ9m?CQ3TDZO9{9o#W@*V#IAXO5q?O{9n%z;-=Y2%V z1V^&Mk;6U<t=%I>IGUqyv<UmP(qPDcBB<iPrYf#WzIwczwqqteSzPi}qhhxJW21W= zbHW1b^!u=n6~<&F0mESKSbB}ru)d^B=6n*z33P1T7mQt;DJ<wnvTD<kIPfJk1v3Rh zM+z71(=8&_lx5m{E^nEQIiD%YT`CfQ#>*M!5)z>CTNKO(k?svexqv(aQie#|LmH%q z`VY~(p1x{nq~Q<$`Fi-+MOuEZGp>{E6|4uGG3O4Y+%Y1t$4nT>BwrC%TqE<Y2wI=U zmDIy22pbxQrQHEp;CdV;J}EQmycspv8~R({7#B4;W0jOzoYCjr6!Q`Lo5JpJibVR; z>#U2jj}a{;!Aq&(G?Fs)=YOk&{H;J!xPUMt6kaSPG)(-7oKJs_oKs}hJ?k)YW)um< z9gOrq|0t_QV5I-*r)ZAv_{gMd9!9zw7^|-?d>`nMkpKQrx0on7;->*|!brdAr+vlb zG54_X(VlrDG8USpo7h`qt6kH*D=~c$>q}dd$ltWES<bL0N)N=3@Y3+nN_aiO4-1{J zM+wsqZ$OHLVLl$Cd}xb=`#NZ9&-H8h(LI?Ol77!d`hIJmK$ygHuwCpYl1`?mjGr6s zl#>GHm$#!OtqW0nm9Ni1+O9YV%LDZa9Am%>Y`{2*8wl6Ebt6xj8L2#^<>z;h)_gZ3 z1^O&_%6+6&BhXpJ(nyBdik9Eyj!rS&N`Qw1u4-1F*NLazL(<aSyDe}X(*mrh`c<U; z(y`cDciU^MbWCm&-mFSqY!!A_rHkdlC}3{(JM|v6+9oDCSuZQy+0O~_u5}`HkMbN6 zQ{a=L_}m{5gy+P>>O={p?Oh?Un#8*p#H;ZcMXTUKY&2Dh0omJyePEb1pV0PZMonvt z54DeSX)$sZb|ktw<tBT+Y(||J$QYl<leCckNQmrTQO($N7dP^TG>&Jb#zCF$tP(Ow z33*U9*{yDNe`0mMlC}<r6LX{IkH9BMYMW9KRE_PibVj!_z>21($NmsAht$$X+t<=Q zwSE1#kJf9dk7Qr-z&4L*c4DT9I|@$HC-LlFvX_zW>StQDJW!#{#HP7GT1k3JjmB5W z6ONT$0<u`ayC}6y$j<g9U!5q$XhIQ3!|)^#*T07+VWsro-^Y`%QhZRwljM9F1m-r= zIErVUA<Y-%scky`qFmHq+W#yc*ZK%=-bXkxajd&TK^2d4Gu#Ou$qjgZuDnyEH{&B& zUwB?s-)(=U@3wA_ib5un{z%^^UGXsK**u-e#-N2UQ%RO8ea*6&y)<T{N0WO-+S$Nb zQHD$wzW{Z1Y4D;<d=;r$9}U5H9+64S4-o^ING1?lHowS2B~Vrh4jLeN#`tLLlWjWB z8qAfsHr5N-)OS~^f<^}7{HmA6_JiY;Z==Vwf5({p&iU_W@ie^}r1q~$YO{GVG57e- zoYqd7AEPI3e;vY24~JWZaLr0Mnmen<yzkJMea_7H^ORT|@O^O5;-e{C@Q{g5g5Psp zG@fY0Q;v8NhQ(7oNaJ8UjR-}!JfB+5TAyjZ26oeatht_zYgJ0!6X&LRS4!Ly<EHT{ zrR_1gAB9~hX-~A9#xxr(la<w$xm+H_>3t;gOU(arC>^6=IuJy`r)d9|6ztf;?H6Uc zZyZ0Gr*SX6)=<xQ#-r58_&B$fQfpKP$%uAq6vQRlT*zyG_&eF;Lrd8k@_!W6E4Vru z-#8_{R6dc9;r08_=AWkJ%1ZNrmLJ!caFd2lxiCTsF>^m-(h?<&X{;Bvxu#i<^STR% zuCiwHEc)y_Z^&bncf+iNvCM^evUUtPpD<SENv>hD*bBGSy#4yVnwk=di();?$5Avp z9YM}{_KdU2?3j1EC@<R;UPfXjAUV88o8#=vy~*Lx+Rc61Z0(fWkB{in7VURV^qTuL z+5PSjeHy%t!5f>sA8#z);_=30&%zsnH;q?|lM<IY$N9`MlMMuUQ7mjMY;2JMHVtf= zBGj6!g-u)JNiq58>4@9iPoqUr^eSU#rZQ7rbbg^A__jB)+l|}16<*bG+vGAXq~jSz zZ=l;9ZoNylkhCaxI^O8!fcB^3cJNZhF$c-UoM!^f1f_V!nWrF2gDwS)%mYRjQE-`B zw8+2!mH8)x=qQ+ov4)jKDbHl(sRc6C(wKp`Fb)9U%o(G2G9i|q1L^EikhUYp$DvW& z93RQ~(!)x5L9T;Su$82PnUGq#6z2;b_{^Zm5FssLE%Zy7Gyt6qLmF^~gP+<#v9~w} zAaw=_m+BJ;k(Tsl3OE<wVfLCzNfX-1(ARAx%R2Po@UI0kA-4zt8smpubgT+KQUE@u z!q^pl)w0uKCch&Dxj{jo1}_yUe(LDWmFjq_n2!=<rAa}v+bU+FELmw)Fu8Q}V#2-X zj5;fKTt~*roo71C3s^}PiYqlO*7&ab^mRr7^Eyw7NgL!4lZvcH&cGR+r>^!x7IQmD zDojNwaL}L`FrUMn$|&k-k!n7PFDj4aX^pK3%vzwSWNa%ujCG!%tsyzZ-pjJwgp(6w zrcw%e{@LR*To!Sf@}}dDVMVH){jxI??I=%ivx&QboV?ccvU6N#rf5^#Fkf-1EmLSK zp|On*yJsM-bjAK0u!s%CA9<eRCm>FY_+4X4Qx?DI)Sk796eX;kDtC=6P5hb*(DZWQ zrg9*Ene>!0nunyo$&Dd@Yw+YowcfCHjaQ|X!cB>88bT8=pQd#}WzLl-k7Y2WFhwvN z++~yxZGYE5nREtd^^pHA$juB^d(>V=WoWpE{A*svnhkXI>ydU&+xJaM%U%{#!XW&@ zQ1DWuEmy<;rvnW<i+Q##L{a9>CHV@@{EJQdlK0>CcW~wz7y%(oveF%){Kd;UY$AiR zRjl;KU@GDp9SkA0Q$fg9f$M(ff@b(dD}Fx<veMK+BAxA5%bWu)os~*L6r-+@w#e$K zgOI-^q><iG-l7rX(;)`WXM+ZJ$p098#`dxNJf&~pEJ&Y@|Gr@A2>I^~h5S_^tPJp8 zC>r6i1uknt#5Wsloc5InHeVxUDcJl|DF2U9#txMAfv+IH6WZq~-c%#~1Q_*-kcv@{ zwA6&9m*x3wqxeRgy&)NS{9Me*8tGkd@I=SM?n1H7O|>j^Y$_DBy;t*+cwnC2M{m}i zfL#1X$kg;?Pw>)wr1zGx-cZlAjX=DPrZ}ow$(X`B5a;<}ane&me=W`~B~IzFZ;5jW zjWb?}lcdi?tc>&_VtuG1AACmQ%>NcX|9YJ9;Ip8qfxlTK8I;S*wCp?X9*XT|8e4uU ze|%W3KMQksJ<sY~q~$*n$@m0GqhW1hyb0GHe8A#K7Y~WQPa(O97lH2|_=%W@G+r9G zBDOnq-bAS(KFUKSQ;lzh#A#5fx+}sV)T~t?)^e=lwl`ky1F0R5(4^6Ff{(*k_{)&l zjqt?iyCNoDYgnrH(DDEF0gd!Av~oROI$qH=fCgidI^t6l{^@mO!u^Q*HGx4~@qM)2 zXJMo`;LJaNSw7Hk4)wA^&M;3o{#&e>cE_h9){s9Whuz7Wit9)ZlN05o7<#%kiu2T^ z?huT=RULGWj`D>3KULgWFCFt=6DZGx;+oVV;q=D)#b0+pgCf7Sk@m6eBJrKX3Md$T zr)<Isi1Kt9xP9}>1wg5f5m(5ZIppt!OYl-;{Y!hz4>49;&lMRzTglB~S(9;}kcu|4 zS;@x%XU6$_#F0U+x>dgQ9u3a#QJxtOGi|nzlx@DCgs>;}a6~-=qkcho&d1n4PtM?& zsrL!L2iF>9wWjnq@c9_HT7WiB*W{G9NIf;UjV>1b*dnUuXdE3nWhBPg!T?5WX<|T& zdbKptIj$6@4Sh5srx{CQmKc_1j4#Isr1utzc7B4e^xC~;mgzWqF_oF!>!tIf)VK`a zy^X%s@R9PZa*i~y^s>C5A!EXLoEjz3lf|{}O^C(dp*2U(5z<p&FNHA6HW_gG>(5^O zl8o`3$hm1+j5i;1H%;M7FXDfU=1YxRonNCDYxz~O-EM=lkSv=!MxYL+3~F4f<f&m@ zfnCuR&~G%Z6|$W$$g{d`5A&$VYSp}+9|xbp4i@M7#$f~%19Wta9T>fMl|0?vjT0py ze_l|_XCtLO{U$1xaEZPcxORkS2#zm=PUYS*wXTZg=?=yh^3M&?+EL5K{Ib?%*}^Ji zPTLLD9Z()<nW<$>$3p#rrO?IES>~txtV@%gf;u6MK8%}m?HxIvxUapMHzMsFp=Ti# z6uKGfj<Q1wNB1-mjno$y|Dhv|gKzs_fl$zaK2_El_UjHLf5-`!<u$uF>)R-QGXB$f zG3l6bzap9zr{%0}D<e3!J|r|je~>RdplJZT;~2CJimgE&&o#&sxQEIc<f+RX_5$I< zuF+_pyOccrySyB$93uUoVaFCqcQ=d^6MMALzm`o+(cSu(U(4pUSH2|G%mwJ4HZU2d z1lj_QJ9E#g+};Lm?Z-DRa-v^QA1<GA7?ZXfJgEGQ1b?*WYJ|C8;}M*h!I}9wXIHwI zslV$&Ji=kjQ0>LD&SSP9w1;IX8k6y!eTbdP@tg-M_jrwWv673o-D^J+6D`oZlq?ME zUXqFgI@4GM`h|5Xt>vU16LBcv58(vrA;AFM`LAVd1N4MSesM-o$?qFo(@VdP^8UD? zT4JI#IV;bjth*mVj8^5$m%)<=ZI8}ly{B4wfK8ld-8#otE#0rNZXMZCEkzT(kIA8< zRSaR^ZVby&dPS=`*7HZVDhZ!)PY~Wb#@aMq>pd$ZhX&fRu-$-|BK)dnm{fjEJ~gCu z>s#n|w6w>#SIFb-Z_4H-X4>}!L+N3RE754V8sB!DwmVr#UQecLt*6W{({^`T(0rP< zN7{B*!>oa!W6erX+EzzqImif@$k<~jjasN%kRej7cUy_UjkP86LkJyjEE4eg6CFgr zw~_Y!gZ6R!mz7h+CwZI5KD`wh>J!~eG(A0}d78z%MCMmmo{=*hCijsZHu}7*btFj} z;&1W(Ue18zZ*J4=!HL7-2I;AWg{8V~!{{C2zT%mkui-iUY+>c0<NYF&W$=8lak*tH zuRW}hs{2W%{lfT*w4QHX)a;D*(q2WS_9e0fvNn^pjLI36ngc8j!C8_u(#HP$jWa9R z7N)tbGCJ8_N}B1n8RBxB9M?!|`)#EcWrI(%&nD8gVV==ae5$j=M>yV>U-`X_nd0$o z#_$8@&1ZGpQAy?CYf9%KJaf+?FKCrq{1^{L%eXf8B;JLb#B@G}XVlr4N^2!u5B`UE z1sW}_C$5KyGf#QA`14N9zK4rPL&IS3St}FWEyW`|2H%d<x^*9kYA#WelD<DvWM*jg z(NN~8KXAU$$#79ht-g)AT#xcs&-AJ5nz)4|-Ndhy4TUXEvxmvc$&x$UdlEGxY|Ob> zF2>j1b4n8jyMfdCMscjqICh1cr_?C)gjZ-?((#N))j>lCy8z&QyLvuw!6(=K%EEr8 zuwSX-cYR&e9nwM%hx5PCCx-mL$D1lUFpywtsE!tGM~4%QIiC(-uHlTv(w+P`o)ZnF zqainD;B2jqFLuWq$meG%@*~-M7%SO<$LKdy_NU+Hd}_iRU@$5>GLZO5bIAV($f71i zPf7FOfOOjuqHEER|7wV~TjC>?G&hm?k#hGbWaWy!!^eYue!$$rX%09UFBz}*1^qYU z-GTRsUS|BLMe3P#DjPlgz&P)SrAx0h-1;4PJP|wWh=l}7U@z!M>PgZZ608DiJycdM zXnbt~C;Us<2H_)dZZDgd2%R{?feVh#x{yJTj|UYQS1mgeU*lG!ueCVSiC6>uSD?Xe zTyX^w)}b=1a41}kk^cExF^Q*|XvXuH*y?tPOrc94HvI*ht*tSNXO1!XMuG7$(vJdk z1XblH#)p29Z&hN7$m}r(&&nppIQ~71DoKd1iI3-Z@p{i$+2Ba+$P>>d=LyhM(vz8! zM_o+mV~kX;XXb?buZHrK5i!bZ6SE*=Q1>|)X?_+WlRx{wh7|^t5U4~?@D~{;g8sv} z3u1fDK4?f2v8NUbW5QfM>hK6Yx;ef%uGzfT@QiZbK}^tpX@KsVBsGQn#|IzyEGCL% zp6Tt~{mk(%6fJy?mzKXibXnFexGWEhra6sK=87n2*H=OhPc`gR7f*afKB9$B{F)Yi zShx{SW9FigG~+cNn2I)Zx1!Go`F|CB<qC9#0`!O+T3uQmPjZbv(*8)_Gy>Y)BfAq? zAt`oUgw!;$nVD+dOD3P`eRemO6@6iQR@4WWy=UN*rpy&3O7R-B0V~t}rUo+B=sRvr z9uf0&)FjfoefQ<7jC53+l)Gs0UB4pMk#xUtd~`D%Q%KqapXqRPDX#f<a*;3g>F-|Q zvXVU3tay(tE5?(PrSsUc9MX4ouaXS96<1bCTHP`{8Qo$$8+42CWOXH1va&{a-|rzB z=+ZQ<`E;JYP1dHyK20Vy^cL)<UoCXTKAm?ZwpG);Tf=tG)7T4Rn{8LXK};sTHh=T$ z7pYFMp*LkWdYEQEKk`aU_oK>}$9wECaaR^*jrNFH37*a1@O$7;zkAg+Qo+)av~R|I z$4p&ytzlLFN2?^W&W|UjyY><MxanC@*k@<#QxS$m7*c%oqx`U2p5itQZkIk<pGBk( zc2(l}{;p~~f4^%Ro}Ih4<LTM88qeSDBGwp`q;zc5k+^1!^q+mp+=hMH7ihb=JxFU5 zdgWXqo!J#}T^iK>Sl?p&(Tg7)>zT{UK+PoVx_otnbP-3T3ScOu=G*>p?keoQf-$od zLvPgeBfQNfi<yrI{Wr6V5kmd{6<N>RqP#r?_oa$$6*Kahrke56@)~)KsZR2!HOGW& zZYFewkjZLOkLWQMj=@~0Z;AIX*7#<V?;CYo#BlniC*&G?Y)_5hg%7{!f5_blNr>u% z<2@s<k?JVVanz8eyR&Y!naPOT`_zXd11=<P@1q}Hf^N;h2mOEOfAGWWJiZzkW1Pgd zoc~4&kJCIPDEfWIdkJYVXv=eX?A$amvl89x6q42F{Rt2atIfB4sOY#6iZsmSwLYp3 zrC}I^k!cvR;F~!p)kuf1ONZ95b0lVB#xt>j_$CUpJWhYepf4q0bpP(LRgyzT%Ye38 zl-~E)^GhXtOtMewy(@PVz5OI6(f8_?<N@X)eD8g==McTSqW4a$8{^~=O%`_pkGIkE zhLl4wY96DM`Y=Rambd38|A{rWR9=?F{3rgDVx$_(QAgS4k=VtV#WT(M7#&j%L&w?H zR)U^iH&SZQ8kHRo12lM3^S5tQb+-<F)RC5wyK<ww^E+^NMSj5z?ky;d9NPoeZvHp) zoNZK2Dd?iPipj8mD??0_75TQBGZ1@xVso6wo{oD#xLfks^yocL$Rq7KpF#0sJZM?l zP}fV1;g%K2$!)U1gmIy0x^LvQhP4vzhvDK!dq!erhzW;`j2<)lw5B&lr+=-zp=FxB z=%V2xF-O89R+EOmFgp5cUr={q{he%YQoka$=nt3+XwhdKPK-TlEzUvH+){3}Udk2L zm{KTT+0Q@?GBJAJG>m-LYi`+R8U`~t@_bP)ZHn!!&ZJ?nn;*k|K>f@f7W<|jjy7~K z9etNrDK=!!i)x;kW#q}lMe_|ZGwF|A_{w?+tqr>!P5LHU(n$XSqsQW=bzryYJ%{0D zw_*py&e-)$@vX$>kQy6k9!8)SH9Ww0a;yd)y<dm%*sL1Z*m$jnv!X`qj5WGBwl#Xc z;n^`MKTa7bnd0NTMLd~oyr_L)3eRy&QOF-NplzkMOfVjj{ly1Kt<n21>ojYR>VQ<> z21a59gmfhB4PV-oFaH!6{$*UN{=gS*lAU^y=cmhTp+5b<k%Yrc5i5m4LPx^BTii*l zhW!T))3`(aF9IaH+iQ3>mP-4q;n_r9yT{;5YR%)*l++y<IX^`FK-1XbFVOU(ePNy< z6SONnVXi0lexPp|(Q0#BFkbvHM7R-6`WEv6<By?v^Tq6=qc5FDAGo&R#VB9Me@5B$ z4*AUiq#SinUXR^Y%g}CX0q$Meo`ZP$=$a;YX&K~BDi5Cd9BZ0m>K?bc-d68i(L-w< z%U8LprJER{)bjHKhjFJx$p3g)7m()D2XtTRI+*bzmYAvLu7PkPd$@T0xdM@{ud=WY z+)`2leW1%t_uKD=zV%ODlKr8_WVH&Hx=e0LA>TYAf)A<>IN_(VsVdLufuW%Ch!*?# z%6_lLDg^yYAf;LwSA%z|OKVc3Sb7^nQQ1wdD;1FRFlLpPS?`)>ZIj=zx5;OxSX_rT z#BxFCY3bc9&s8nIN^WANIEURF12mXyLWm`yS(Q5~J2xbD#9*D<xxrIKBm?j%TKV+V zChQbbtr!ir61V{K%QViVu+e?;#;e#L`NcPRBH1fE!bXET=zk^XQ|Pgvu!+9^Ea+3{ z3qfu(egBuBpwQ=nZ3=xh=-V>h)q>kdg8r5uO)C^^t7>r5JS@ZQGt4Z<RmeBtyKmAv zlEYzl1&L%;a?=$oto)#=9xFOv1N+R#(E;EAVqFKYhO&x@9n}3_k-I3lpfc#+fIX?< zdHe{gT{VvvVWWHW!}A&0?@Lzn0ize|aa$52ot3rx2ha#@-O7O9?g1_Tyqi&cev6vt z_!wXuLVjzAmTpT4m3Yb_;j_M=e`1hiXk2z>H;G~pwnM(JL7UhNL+hIA=OS1LtTp<B z{_G$*K5_vgJuW9KRx})f#S=;SXGr<+aLP~0f|~%15b}2g)%!_kx|~ohFdU0M^EP(K z)V-ugS_=!Vx51GAQLMs}I?Tw=1Az!8W4oe18>)%C;We?l`VOUzc2$3~oq6O2d%5BZ z8~08BH^bk)@vYxB4t?ABE#Iat(enE7<(0>sv7RfHDi0r3elv}gvU$!X_aRXY@tpY0 z5X|fg%AH0Y`2aMr?d&&0sP!YDULx&)WZvf)Dvujl=GV$&=J0;^E#+~8|JTan20xGd zjq<p`|8JDX4dK4EJZ=c_t>tk;h~ed-j-4L)K~Bpj9G{8%gl_U2s_u4=5ifKgzu2MF zh_(*&|ABYq2MH_51HS5r+w)<!1%qwXLH|MJE$H6|+Gu|bF&yo9SAN`nyeCM4{wLwO z7xo6&8)0t=+jr5>aJwJ$0I^_HFnBz2JG8~D#1B%ppuc7SyG#w^u?wl6xT$hpakS@Z zWrT-y1HYHs5azoBtI$$x?!%%592>#$ssZhE2762#=AxyziA{bac!{<F5k|rs66v2N z^!gUJPW-8JghwmTmH38W1;&5q5rQ^on{}>(7=h@!7$Vr~i(roE7?bnqfv|2m<ev@A zb9!|m#)=f+o32z@u{W0=e6y+$yBl;A{@y@R&t?+iN(NHv7oh^|Y#8JsF{y)t-;q8V z>jB(8L_^*;Ky}X%JX8CZl@E;cw12trfq0Lj_vL(ALYf{1x?so&xNk@2Iw#hYXk9IM zvaZ#5Li2)W!7JCt1#^!@<LG6QNLmWLqfbFX6YD%-w{S*I%`^9yG$bvt$HY>61jSLu zU>71e<uS{c`xEbG@|dDN?^0;I=UJNN<S7j>z$(o0L)%aB26Qfo-1|7_KZdow{m!Mh z>q!KnOApDGWNz_b#s5O<N+$pKmkkf}cT$PSZa*lG!}??#`<UDGA~#{#_T5gyx#VOT zLVK3U-|b{%W|RN@1ewL1e1Gw7qBr~1lL<`oJ3uj8dD9CF^g!%0tkgHSNqkREO-Sc8 z&80^fAbJU>eTHJH=)SM&M^{do=EuM0YYvh0caD@Ee*DELkdmmLS?Aew{|d>h*>rc} znkb*TBSl>}>T>5pH0M4%%TOlMj)BvUI@5jcLAy>SfV-{E<YPT$nq-^)+@|{xDou?k z&UdV5CtMA1Rbxu%IindC*EDA4hu&C}+MxfYL3+nz@KU`pf1Dg@Tk(UmZP6X#6tu-F zRf+CHXjj=jI?uWSZB+$A3T||3ai)11|H_P;)nVhWq3zK5`R#t2cxb~Uai&1Wz+33- zoHuva>^!_>u90cWJc*V`)0&KZdWyBX5of36DWY!BPX<Q1NO}^q<tYNz`q&pSyL7&! z9!<Pnc~kdYFz&-m3vE6PL0Z>{U&q;Tyo$67Ub+wEupK5-qHRpw8y@sG3_R3sLVx^u zNXL(bT!20B;BnvDr6hec?(4fnwih0CmO~q=gEn;OS65dYbl#@)n1jw$o>i{H#}uqd z=2Fisu1cQX?nm3`d{0u3g+(7pBx$V{-2Dh7R=`V9cohO;drMAD&wT%&tVfI0v(4@m z+jqOo+bKSEOiG$%b*c+BtJS#fW~ML&vR7@hpL^G(2Gdr+$Dmn3d(lkUE1>U>4l<DX z5F<-`&k5M2_*&m{`RJZ1vF*X00)W9ND+{CW#ob{+pD^yDd`%dQ9?f<;qcz>p<F@kS zpaCB3b8UakZ2(v1b4lIA(2n+LJllI`i=2%0O5(gmP}g?4u4!>f?*o^Fe)Wl$nXb*f z)X7*g`9nelbf<3*8fH-5qPn9;=(%+Mu|{@E^G-I8Dd@vUiZu%44_*79|3B!BjE~WJ zp>4GRrU~sLqT{8z#o%5a@*l(bhLC?>@SH3<=otEOa3@c7=|p<5Vd*tPP0)|kAWyQ1 z^i%A+ie|XgveKqOGJd>}1~fs)uL<dS>^kQ<qz4;ldqpT!p15I7D_JtL13n~wsFknk zdmCxq@Wl;M^f~B9Xb->DTZHnaz5f<3ZR3af%Ejpmjb(>KSJ}H59e*oi@v{Y8R@8ZI zw^P&lNSd5rXYytVUv^P<+d^75`<=S;iOFN`U$Ij4nJr{2dKu-fKW|H>W9HG7bjSG1 zF3L@wD#P5s{ge*Mw;es0_D@-!s`Sj2O3$2sL(d#3-!I1dUcov8Hy^sL<sWde*ky;_ zR1W$r0}2+)M<&?OX9pfr`|K(pJ7}M6?*_i+Gho9|XKMdd*DX5iPTH`O#gdT!rV#M8 zg1Y-JVUH*>u0Pfuhc$~H8rwmCY=3zw9i^kr>04D?Ezq)`>B(f@_=Ky+^ha1JNp`pi z#`sZomacu5K@Z{3K?h3p5e#*4FzM_b{eJynCT+RM?9skJ_UK-~cYy^R2ceI(x(!3C zKx|q0PE+JAQuw-`5&I%F(C<gaNz>vO<mIR{+Cyj2*JX;84*87(9OhaUYa%*|QJ;4d zOaPr<=^ReiWdj&#Ek+Z{aXU0??0MSr8iAAu`aOY<L>-?X?ZTb8LH}KWXsbp5dL1*u z6`{K;0c(E^YV3|cy0y29q$Qvg89Ze|f@F@L4lJ`($ded^ydsi`WkNn?mKDHjToLHL zLV|bDuaVVV2%TrZKNwPXAT+>-FjB&x86z7jeH^5F1P?wi-SZRCDt<S`m5QB#N~W+J zJ;HD?591djJs*hT(|yaq(}}K^(K3vlkr;ywp3$z#5hI}wUm>R{_;ljKEqnJQLce45 zu;KG9nMlJDGJnQs=o<cMk6}L$*frSGoM1S@q|?~9A@+ZFKIk>Ho;!wCrK~I4t~ivv z?yuj$dIECQ-@1d9m9_`z9jqr2j)sk3LV?1>Y|Ue>JP!3)gW50|=@`#oW*N(mLaRF~ zGy6U|_K0QS{ga$V?{qf_x4i^=K3E}EBgMD)81CzH37tu58W|opw&N^M$nP1#h0)lx zR;()1DIP}Mvx@8$0pB<o$Yy@MhvcsFkPIE}ug2ZMT%McFU~`wgKg&9+W=GBG)U668 zc8up)Xo%hfzW9W5?pfn@9gy-sg<^dD(o0dp?}UK#1nM{nsAHXnhRQv=#%il!rs?;u zqw(6KeALx?Hc|N&xP9f@sQs@hzJ>1G@OKGkbCvI|e-r(+Z_qcLy7zIfG)7i)e|m-< zWn-&B4tznsp?_3{RtWl6<CGQMlOjM`sC#q^FeXIw7zUu`EuxCl)9_ZT$ARu}Gbmkk zT%bA_8b0!E=`i~;*jdE6T4)i@VfSw(-ZhX$RYV8&z}hkPP&f2B2}sf;;}3w6(DJ9s z$%LB)GXAt+%+CKH*28A&J=*MOk3M^*$B?b_O!i%tg`LpRkU3ZbTV!C71iJf9$Wy+n zTUh=UNYzaDTn*{o9k)U}gfY>SS6kfI8Ftg`cd}=xJMob8gdT%|#&nY}K0C=XGCS5Y z3aJJC_b6EXp#L|0XS<4Ai3rsq8ho>0(;8Nb8s7}qOonqJ15WcXW3-fP7nsZ?9&?9= z8}y$EjKYrjp#Q-j<=2?40smA!kM`NB3d;zWxxtWa@ouWxQTDiX6YL4zw9<5O1m7== zTavHb;2D1&+_K$UuzRIx5tu1`Lb}+~1r3#w*4yBiNaN&Fn+(}IM6LI<SXpJDw_IbC z0`gZhAVnim)Mo3vg_Sm>z<765ZrVW9-QzGus!&W+xO72BLh+RE`~p}Y7+Np1uFk-o z^Jydcp8+Rjg8t6X?rMtkWTjI|zg72(^)BrKntxi;>VC0^Z|_{BVl>q-d)lL1q9R)v zTj|`&dQJn`Lx9FfK#!#N=29F&q+L8d%-%H2zIT|tWtjZ{?2-0r!kABNvFD*(YBsn? znwsjpnYc$2x^d<7mW{c1z5O=g+fx{O{!hAtHKNzhm+F?p0GUM*S<2nqvt_K(wkz0e zsyB_SdH>d(zuCWqybbe@gq@0Tb|tJTOK8(L^Z`B)t(?4RDbb^a08s@rs(Rb6H7r}m z{VJB1w!z50G?f_#{fFf&j2Bb_rnirehkc@A-^u@?xS+GG+YkfXj$WIa*Xh8>`WV(l zC!FKXwo}Z~Sq+b!nroyyIr%5J7uSK<{?Jc%>CMbfoGHrtfAzNmJM;n_C!*DRtmDC5 zCa<nceuF-SbGSskA(--x_5*xi1idE%Su^Or1JVQKpYl%e$h7aMZ60#&*X{+5v{Az_ zoCfs6d84s1!Rqw}JVyKLG#+*C8}P>kU&0wsJ>-{*SmltM`#l;CXTJKF%v%*3>AS7e z0{u$nbjG&WGmu;5S-EKGwc@Q*W*7w-hVD!d>+|xgyu~hhzBZ{RkHM;fo*d{6Oep9m zSp*j{1))ROM_c8kZ>%)Fe_m>l&HR3QPaz8zji%d4D4n(F&6I!XE@w1WRw_sM`QB+m zsU5-lB5xMXr>d#{q|f(S_9ELt%E@~J>As1$G25sh{h)1iQ{ATpqp<eKG_1K-ti(y5 zyklSXKj7~qR_);@WKG_H|G5DclA8s$2h(4LV2^5#w3T2)${FxKrL2$PuHe2&GvtEc z@VDRI@b=aXZ>Mi~dj;cJ@Y3_BJBo|)opIo%ONP7)`VPzim^QeJpfysYel@6p`7)Ck zrPRP2d4Yn?#0fI*03?gF5Je-7gCs#3Td+64{J*-tJLI1SozLI8zZ?3eK{^A|vGb=( zBRrAJm<w#C_M#?J?~TSS=0;x>o)#g>H|RGjScXBr5X4N$nlb0oZz--jGIvux)wUa+ z@6qNBVM&UHrh6QRQ4W#W`l0p-N^jKje?Fey$YQrP59>%x2b-7JNOk*TOPj~6HD`!R zC1Ti-ioG7_XmAz?crOFY^%EcOx(EGt0xSKpo7rnFr6GYk8y1%Qu&u;`GmwM++I})V zDy(VO`m|vi8K0@>2qftAPJq95m=_g3)e{sK<;<r2z?+~)W5q$w_>TnENXsX?e<2eN zzhr>lyP&v(^emk>zJr;Fem?Q{$42`o3Y^KOUyXEIw^Io%30f$M9k|rLKtXli=*vun zBs%$hFPF=BqI2K#-rvC#A@6Zy!WtUCy^h{0VCQV`wHbhZ@OP1%KP#v)$cUeJcTrzr z+pO%9Ydo0amr>p*N=?0)fJwuN1;~a>9u2w1*5|q7Sh_9QOV=4jZ!ThI?CJEkT&8OA zYb|j&ZG)UlSZ*-*m|3yz$>9Hbj!4!udY1vQA0OAjWm-ManQ5LL_xGWttm$_kx6D*q zjS_mAnn$Z5iy9zr3H_OB-lwWQ*W+ZSzSNcDra68H=jNDc%5RCpUH8AQOFh4aocXTj zN<|1o#=3{v>1a<+C%ht0SWK*Rw0cO^PDyu7!Wk7h58UJ$D~xreib+aoYC5uc4RnAw z`;Jk7uJE)W_StI5G4EMt>RFAlgK9ae>3*2BIFmXD{gWUqKIEofknV?BhG&n`Z$1mM ztx=2c>m-<;2sc(xv5x9$A$aL=;ItZH=vjyZph;+3htU_*HL;3gvxm99L(W-B#utez z6?t^FZ?=tim}wk8;J>+Fle{KXt>Z7eVyZT6z<(0hrG^GNqEm_P6HgKSy%*tEkg^B- z6Z*}-rq0eadYH5Ycz-UGDV%ht^9wPO2Kzl7+G(ZpX=sw$<t-99^o}bs{RJ7D5QDQe z_!SXIV*`&-*>=$Xd-xy)`-!gM<744K@X`SCv=@1zXFb&Xs5tFJ7a33MA?WW7#iO*f z9kHd{b}o}Sx81$Xot~-j#$xA`&WIuZclrocJIvHScX2k&IcBPLJF!vy5Z#%|f(%K^ zO^sVpbeQxvfP(%aoM$H4cX>YC62p(^X(EYOt5ZpR7k+I3?~0U8-KdmKvQ~J0D3Y9I z9$k*cORUWT!@0spTS9o>#HtA!mWhVULT?7fjVoL3u$ZPaO==PPE+mNKT^p)!&cwUh zI>DDle<8uU)0*ZRtJog2rutG8+e6mTzEO&8mo>qcsMsF1;#Vyc+oRaYHz~F!u#-=J zbAj<bX)WJS2C4gS$%YLqB+F*uaLL3CuRunptEm$#IrB2i9zxCl0C(mIm}Z!#VVYo` zgo(&h|EuoCr|WEbH~vYq-!m|D&+rrsy+2f4f2;L_-zOSB3ghGVl-+aO!-D;D>?052 zoXOci|L5xdc}AiyDxm)=6>XK3{u8|lxCQLV#zKEL)%`L~h1HJ9OeSdKDay_xU0+6I zyD03;PwX%t^b%Rm+k9g?3edhE42}2E{r55FXrBP0rs=X=(?<8_F@g|`7Y-YcG$gI9 zM9)77?H;jTQ1)eBkVQBB?$h_FM)8n5=x<dyRP<i*Q|f;0pno&k+o1o6eyz~crJkc0 z^siIgcEjyzSMU<ur+o|N`d+@OW7hJ}%f#Exja`xooPgM17b(7UATSOyd=5?>4EWCm z?4k*M6Qf=_<%|G1pyS``D8$@ningJQLjGH^i~ONigPGXXkKcA`8uXVaGzx3BkiP_c z&r$itY(}-I!AlfZKrsdCSp)TVjt2aOK1c7V^{kZH_foeub~NTSjJPpT&2&bK$87!N zM|6}mL7z0fpI9}*pg&PTRt);fm3s~D|7g%}f|Mp-xGa+&GFT<D*}(RJ>%{H{M`E<e z9*$qXEMJ>SN8L;zNxDf>F=9V+8&K!EJ<&frYoT`*%=<#GXEEO~xvY0I=Ak#eiHc51 zKcrKlHx&E~Cr63&Zvou_^kv|*qIS|)#w1hyQ$swFLJdLx^YWWjo$_J3v4c@g(JATd zHyvqN4Q!>t1O4)9Lz0^!_C7`nS*f~Ojm@T}V(4ga6H9~XfWDb(2$2qS#7{Kf^f%y( zk=0-H0o{H>^KIb!tfhI=3ilp)s{ILhCV4_Gu%ic;v*~e1M*Dyy9BgtQ?$&88Br`Tg z@4*HZ=km3OSxJ(q#7d-}H0WC~zvV}xzEz(qVV}L!CtnZD;bpmf9=$(CXT>g5ONJPS zIft=AyP3vJYb(JCxy<i-q7ShAW%)i0m2H>F84g{G@o3x;4mqxwN3qZ}$9M14w?^$x z>}F$(t*+wo3x)%i<ps?jyQ5ol2V$+a$y}Iwa@&6b({4P9+iH*t_1o1ujjfDr;f1Ju zv`h>Km?=?D=PDZ193O*PV{>D?w#Jv>7enO+rQF$RY@U9P>O013LGQjtreC)>9g=-# zOb;7#pF7qX%h9i(n;-H^-x;-^$&1<(1Dut9|EtarP--S0Eo<Gr+by>3yHM8j4f_`9 z`^)#tHykv5XgC=AA#D@1u7S}Hw+5+!j3>FgmsjdEc4urxY>y*)Zg1%3sDozA^Z(Lq zU^<*}XP-gcGSitUF_?`~YnXi0NFD=C5B=S-KX*Q|Ao>9P?ofAhG|HAB9jfKL?V-|` zql+M6nvX<5t|Xc0Jvt)2*$~sZf4-~uOz#^Fh+p%XQ`Zx#rD@VQ-spVA$L7upbM#h2 zgrndM9L1isH?q@Nm7fMSpOz#Gez1>f{7YxWU*V_hTlm@GQMuW1VK^^Ag_mD;*7$y* zluU!lN1WrURky}|`P>SUencsm__G}tG1)26IB5}+$$C>MFW}_Zm+w_mUjEcc(&v|I z_ON^K)$-Pq44iQ3th>WZ-$>fhuRdMIJOiYnudRgT4SQZVP9{tT@5E|8qP9`e9CMUg zonN|V%p=LPm1eqe<I(=FEXSOmeW3MaD{BJ7ew;maj`;u_#k^X)REpIqT=qEPj&z!R z8Kt<RZ%>98bCja|A>F$nqqmXq8Xx_|DLQsi#NGt&Hn%Rv;2rQE3sFt`fd5oT2ip2c zCgzK`LO=S%?26vMLQc2q_P1K-SmFS}j^guDY;&&N`_h2_nNX_oT^sJQ`KT+Z^@VN? znfsNL{mJ}*zXq5g=_!gCqvJkZ`_Xm7J1}p<&~@POGuTh_^j5P|>*!rCl%ww<M#@oz z!r2_(fPY<(WENf^*^@8OUzj@Jw4JRO!7ah4X}A@wThrZ`NI7KUZ^8}@BfS~A(N*tR z#NVRqP{iO=RW#x&2<O?Uq;z3kp+KYroEtPMeroCy!eQ=K&Nx7l4xgkxxe<7#q5EIx z`5vlcjr<xJ@McOrw8)1}iJ=&Avf!UNAI;6hy(BX(P(2Gyav~2I-;#%kN*>C-mWL6F zYf6aT>VjWV!c8lbLdsLlM3=e;{2v6h!T^4sj@D*1kW4gBamZ5?(m$iP4*1QHyo9xs z1<1>0B`>s|JTSD*Xr3bac`e;t)aBylfC2wOWtBVN|5I>`kM6V3lc!1GYrwy}Uyt%- zr4;O85BR%r(t0OmWafM>)~&uuGq{@<=ql?HrePOF)rZqEi|i($?#pN@vjv*U#&9aH z2F*x?wmTN6hAV;rb9unO2@(&mkP50pFRQ1kPlgeACo2Q~A7bBJU1xvZj(N%&+haD- zU-m(tJHs@y(l6w{bSbh@4`*z?Dn&Kn1Pnbz@ojEVCkWBt7lPE^h6?N5Ag=&xirO8e zl<7E>ZsK5MC(DBRjlU49)UWYujH_$}+UU@(kkX5Y9$(0VYM)!6V9Y4CBU0`SZkBKF zZ;;&mJHI%S65qQx@lf{}&7p3G24g8X)BBSKOG)1)clR50nXf1Fj=ApcT|+kKkc}O( zy-_|CZph{wvav(9H&zUV8?rfvZ0wNjjd?@ihHTCu8#`osBY!B|kj*({V~1>SSck$5 z*_=Z*cF6Wd;!wCDn{&v<4%yz&422uAIm5QcQdB=$pJv<*wBU7zv-z_$Q|9Xno&PL% zclZC-<-Yc_Qk1pBxd7#@_9?81dd$XUpE24Ao?AZCXlHu#{Nw!b{@p!^9mo22^>9;8 zVXivW|G30@U+I5X;_Qx;+zVW01wWN%I;Y{z0-Qo34>>$N95c0_>3Pr*I}f{)X?kDZ zrS%44ng7`@>le=5VmRoGI>&VGb!yKgj5#{jk$OuHVNN*z<gF+M9@{qpBg(vB4Ar4o z8EALZRVE!1RQ^WbgeCi)!&%lnm)ZN7HHz(A?kvX{p8r4a-8DFz?*|C9@d}@F9PE24 zm+E+X{jM&GAqw~};|8*ij;W}E1oPMTaz|Vv4iy=6<98%2;D6&E{E{ehyt?Xrv^^es z%Q}8?#{_pQ5DPYea8rCEu?8j@8=bA7QHpwhz`r>_aTSn70;9MzU(!DP;eh|qK7ES^ zYZu#Vr{z+6$d>Z{WcLI&)p!;lANv9W{#ycB%2$g61PG@aQ4KNJ1Cua6Bn9H#Hy<yo zIqhbUdJ=RBqe`_v<!hQ9B0Y(VyC|)Rbp7xQ`B7Vm-L1u$1Fu)-#@#sFyItx!_ukC6 zy~ESK18FA$k3cyt52SNv!s}cr>kQv-r}u-<{dTJPT_G_ny)&U1S`Ot`2Z1YW$2wHi z5!jXeK&rc0;>ld>6T20hO2Geoh^w?!Qp`%g|7=L8+!VIAgxV^PhV6SozRK>f{qYdD z(Y8?y|8PjyxG8LJ2(@iGx=D4vH{{#Y9k$npxXrfBs(V#P*t{uh7ej5EkB05*LcY!2 zVfz~7$KE&`+o|QRxy_3?kz(U0m#&Z?ZVKCrLv7;GuzgO5+hhx;Ix{3}+7!0uD=`Ky zsc}Z;T8dUG+9`+uV8h$+<U&3?$D%X>{uGo$z&{!#5b!63IJl2Mt^@u!<Tv0qhT8Bn zgnW4FkY>QoBDDap@;-zg2)4oA2c&(#{}pid0sj|3*$4a*F!lk+H$FT+3vycmz=jKW zejIGW^Ftu-1O7`vt}5Wa5ESq{2jqRg|6b6C=h+}v9q|8GP{8w@U>lyl3HtE-Rq$P) zd(m$|9|Zk5Xd~#WppS#T0@?(640JE(&p=y1UjRJ-`Y)hupwEFm5Be<VVbJ}cCqbV9 zJq5Z4^bF{epl^Xb3i>wa!=Ueg?gBjldOzs9p!b5F1HBvc1JGJfA7~Zm$DkWQuYzs> z^?<Ge{T%eWpc3fqpw~ce1(iXUgARZ$0VPbpzX((d%7Yp}ouDSrn?cQ>vp|zTr-NER z^FUKUb3r-KEYJ+l380yv>7d!5<3R18DWFq9M}ZcACV&=!#(_FOV?gJF>OmKPvY@4) zL13Mif%b#01pNwhHE1vB8qhz33ZS212h2jxG%LS>-S6)YJqQHFuJ#=QneYd>sBM<e zA<&f+>m{N`*0vSkbVhU<v{Y$RN^zpU38PBWGOWKEc<l2`Sn6B+)y3PW_GrRI#(E*j zT-Z{ab`E<Gn$-mO!Rmx_Z;k~L_gu9UrOAgmU?9>bA*zKM+hfqhdP=`~XP!-<=cm`< z9$Av}o`>qW4AZEVnB@GYXYFSTSdx~B5z*W?qI8Ei3!@r6r%(5S=pIjj+gSSACKhY+ zlj0<BrN>Pnh9Vb!(fQ>b18S{q5J)y&+urZrgPtfo^)AM+smeH3qhN#{0WJ+Fp2Mm9 zNWLHI33H2;&*Isp_?9U=(-hZ2nzT4OC58^lsX&$KhfrnF3MxpMOT*=Ot5S{+w*LY5 z`K0pq2^}btSA{+y@#12fRv*>JxR}|gZj#eSQJK0U&=fI+_ld4z_B`%njwZf+{P#CQ z7B<WVE=42WDb5yN+iVP%d^*1wdztiBVbbivTBEIG7mwRr5xSg~|4Le4lP=P8OUo3^ zD|CbXY$n%<o$kL;4{70gFzZc9J>&}%<MZsG9w)3ko~eRiI%;78$^8${;?jFX7s{AH zO`zo4$TMvvKKChc5Hk#Jo5cOcnfwYKbC*;MwB~kq(zS-_v7W-sD{x1F;RB{Qut_}& zwgTaZlpmmN=GJgMy`t39j|Uv#diuGt#-=SQSILnhoTE#9Z07jR>n$tk|7q__;G(>) zzV9;&42wDh7f{quP;noY85Ti?ZG->;MI$C!2Z1;wYyzg3q;XJ_VwM)gG$@*o#59_i z>O^g%n#MM!Nt>jdQQK(LI$0%AQ?$lshV}cO`^*3u^EU7M_WSyNzqb#ZInTY%UCzDt z-2L2hZ^2oIdL_<ME9Gv^Qt6Ih_S-8)K`StuN%8*H&0$!7pG0Oh6UP+HMEwLeSFw&y zI$N!C%7$jgg4;r&TSe08te^`6kQQ16VNI#v6IxlexH;};ZjOuZ-h}>=`pUt4M)HpW z<R2wId!lDJ=QBlPAoxt)cw4iqF`!v!RD<8Vz;7peZ|?6UNkxqBr)|Ow!E)mR$IrLR zI($`rLjy;S(M+8cW5`;#{9fO>(a>Ay+c4TfzZ>gDTS$+gFYc$NU!OIjO~I?^ZDYe| z(^j~#WA^x1!^Sml0dKQx<=-;ldI{Xqx7*D=574)}Ou^OtHXGeG^&T6^?7MN}1EcG= z_Pg6?mh89ohb5UGGy6Qa%@ka7qwmMe8#it<ZM`W>yHj=av5gxad<%G6{Z{x1?C>6j zwrkjsD<OWPY_v9_ut8U17T404Mbfwm8)WgbxTZ#!6)?|tDza`H4=s;b0Uh#T!FEHu z&xuV=O~)pup~KqVF-ilikR7AM<FS#-6Ia@0>8kio@#{LSibRVsZ0)t%_g2j_#1HTH z<8RI}|HS+!v)!q-*qy^0?arW9yEEjdCPE775<>DiL9SF0QdrLZu)+{l>qSA{l=9}a z;Ju#mTy;ZfPMHxEpMJ-ZV&6I$FHIRrib_*vspq9BLyl5u%1na0G-alGxbZVnS;|f8 zEcNb^l$ny@*3V4kC^w~;1e6XpZR93*ZfBXP?9lEWO*P5t>j#w}*`=835e9KXmYK>< za<|STxJ!_1H*WOU)+5ZvH$L{@`ucS>6w^jC#Y7=6wmxWM(07zy4llo){_@M=<p;C7 z{Bn5t<xu&J;pG?L)N}_p4c!r6Qu&4AS1P|%UsCxM;g`zqxr;JED#KiN8G8K9cWQFJ zqZD~)QW?&7s^CfrkIHZ$yeSCJvz8QM3~38$JAIgi85~FVx9uNJErvzBFpc9bvAkzw zSUBVZNMoHB_OVp<M@I)X>|Y?eB9q-`6(C{d>$q)n)7_IH&jM+dMC^<th;~I=jD^iS zX(wMwJA-T@)?pvY3mfY2wseW9JrlzerY^Cm$IH<rCiKw!qDy=NF-ek{9=W06#vp5e zb*Y<@aJRcUx4R%nU<5YcG(FB1blRu7U5&ukA&%R|gf;}`E3U{C(AkWW2g&ZQUhbIh z>^XOVg`K%TeV{b1J!Q39J!$@XH-)hQ>3o5w^Tsef>z1gG?onZ#k5X`kOP+U$)B7pI zYP1ouA#VNCcdJPQHN~Yyzpe25@je!&*dpH|+v2xf*y6jLZINfwx-x0HQDfcd6z}7| zpWCx=tC*H>#sC>+YEfdL8BaEBto^p}+B12$&mQf^d)vQ~`(L*yLPI+Gu$FuGxR7gW zak8A_VGQ`_=--c)*P(4b`ocwjRyA+)xWF@7P>;6gz5N&c<=4?x^+88S&}~)opw%_O zzoXCJ?J{I@$X!<Ge4T@K?7ao!WVWWS{D)n)Nnh2*s(JDQGH9})v`h1-VUV1%EK(Q) zp{Y-Z3N&?!r=SlVx?`+#Qsh(9i-q3M=cmA%q+f=#%aA0wq|;B^Kssb-omv_JJ+hDF zqcJz@Sj=_PdD}7X=ytER3M%7R$IzC*%t+`X@PQ;1YnpCsm>1qgYk|%4y2LTv7ccnS zxE^?0;F>7Ns0Xf+HOsehc?dpFmDU1jJ=OuB_@xo(BYgC^%@}WjOl}dzMv5b*Zj-cT z-X)&HT_D8S?{T^LG;qqhB%5}I&5S-nl0-XFw8tv~&O4vLDf;m~1<uJ>HQ(r7H4nv^ zJLuZ)zR}jlcDRf+<s0LXd!$?K5XNXe2zMKg0drCwBhdi8qs~L-ZnH1GZgtb~W4Egh zv0gjD$n`4m_4AN}hwft?k=-GX!Sbwm4y16Lk#yuJjN{ru+E!w}HNcT=oo5}18Wmb4 zatRkdNGOC>b%~4lN<o+S5>^T*?>c@ubgLO7(;Ao1(qfLnDUTFm9N#tnopY@NBS2p| z$uSAL+}`#e@DNFkKM38|PP@OuV@8`2k2YoQb^FLRNZGUsIyNoc-i+N_)JkZvIEeA* zyT<3zeNMoRm14*HC(wsQx(Zs;zd4TG7+x!6HiW%rE<ZUEVi#tQI6eHLw`$iFnU~J^ z^AztB;dSJ5l~aut?8OxEcnx$Wlhm%tDcd7+d`hPV_vC3NIW~ZTF7eY&T3_fAqp-d( z#xZ@2Z2G7(d&kW+zJ!ppJfv(2Y3|Pv(qSHwH{zG=!MwARRz;?1FgE3~`V9Lv_wF6g zv0j9A@FcVmL4Hc3zcI0`OMI2@Wp{}^olFyomF#b9FQ&MTn~jj27T>|CfX5-TVj4Hp zv0|JM|5S?dRAAlRL3ck)eb06K3!{+=`KQo-fAd<B0;QvEAld(S-lV$OfjHHEx9kg0 z#=Kob`L2Wn{oua92Yms_;_qK5yCU%3K$Loe#a<}M8+rq1?mfYK1BE>`2)QZs1qd?{ zQu@>vJlRPtsotI1M-h{!FChI^T<+95Qqv<AI!Ts++Bm`Hjh02O=@jcB*OPtOz+`w| ze}vK_>BPdk(;eOqxFmp=L+REpDdQ~w$@qPS`aD?Ppi{(I<$X)C>W#8ZBr)0u`EtxD zCPA*(wKRL3G1PqG@RF<o=s;vE@EvjwbXtO8=lzbX`I*$N&>r@qmJA+4W>!|F#x%xE zS|roBO<I;Q)8w{E;x>jXLuRYnW)8Q}6dJ7YS#g=MT!LKB?Hq2Y`vR_I9@^WpGWb`T zJ^9)cnj8ncDQ#1-G&p(MJWsAkb2y+Wb-XPUr_4ia6Qq!{))_UW^xd29II3-Ht+si2 zTt3Vnd-cMEL)e@2l4REH1=m>6aEA$@1lVwP2ENQz3-&4(SzBS}ZIk4N<;FnBrO+Ox z${ja!P~zTzR7h^oY>#+dg*mJiXOKF6O7g;&0PTP<z|KG5Ocro4um!LMPyjFhHo$%# z_P#uQw8MH@>Z8Fo6I>%Pn%Kbk?*-0()Juy}Pmk{bE{U%SU7lWA#ZNeNi3RXUycN{& z#>EZ(W53SJ-Dy^w*qN?8@#;l?Mb*6J9n4?6U^;M*vGVVJUOT_BESzLMkkV;49g)5d z)R#vwFB*jvRK0aJ=`lA%xAApU3)4ti-(|akjV|#TWbH`K<34<is+(@1Q#!*T_jt*s z=%0~)aY0)r+ubW(?{-*a&8fJTL4EGol%Z#aSRvVlncIkL15S#CK?5#UGx#pPtXXMK zt$Y?Tem{d0<l|OD<%tV$&1L>&%|6)zUqcl_2Ymb%edD7}YJbpAu_Ku0(HxJ3_K8oU z4WPY0NkhGwZePKE8rD!ce%C2!^^n<fulH5?IaK{p$-+c0E^~1eCmVtoR#N$XAJz&H zW*+LIr%myP+(-DCvBW(oVaG?`fxQ8Fdcd;+?FM%h(5b6nJMEhy#r6!V5U#Mv!u_zy z;KvjWk5)+^oEx9Oxt)A5O?RFOZH2~3{XEvBAnPYLok|6FVeE7b@snKdKtEQ;+cp*+ zafa7{l$poJ<q#EV0nZ4Furhr$h$MJ~VH0eDT)*2`8=W~3rr%~S06j|3GsMm&5Jg_t zhaj3T`vxYes7_EA$Wa;7Tm@a7;z_>4+$sK*?_(2Pq#xtkba~cOrO`sC_&e^tQ#`=^ zPe4dk>`;%z4tu~Es(ss2h8!RIt<efmF4)vqC+LLkV9JS3vB^!rr|zBQ!F!oh&W*?s zI^hyqm>dwCg}m_Wh7NzhyuQs>(<!!g<NPPr7E5|WrMfTa<s|*)@ul+v{IYHv@E3@) zK}?dN79b7i(M&=iJ%!W!K`0X{k33-StYm%<jOSDy`4o^k&wV!JZeZ+D$#=SU<D@AI z?K1fxydOeCGwv6$bYkt1wBt2d$Tp*!O+N2Ts3+}651S0LELS&JFmgiEa<}b>iI1V6 zKX!Xc?(tAw)-iTZN~hnD(qvwuo|INNd(217Z{rMwzgye9<a;PiOZ&5E?)JR%m<6S; zq?kX%>fgg=AIBmqWT9@dHAMgF0=e0M6)18)$@H-Kyt9F*)P6F$Mvz~8KKLE@Z=(?r z&Ly{8Fig-OW#c<LtQpS9jI=UpFkWU8J*jC<@j5PBr8N15rmk9NGH9<}s1jmLsR0Gh z1GpZs^oc%wtPMHWq2zn=(uj<-qjuu_GU<z<@_8F?4#*ZzzK5WEsH~`*JZ-MRNc;Wk zhYi6TK!u*B)!Zpg=^|Z?^+lheR7g`}5hQPe8mL{A>Y5T`ll=bu_e2McRe#*8xr1cM zLT!;|VWz^q*|`Ddj|H5Km(3gkQyMqnHXz6tu7WNJ8E|>;h7><Z_e8IBUPS}F`c&s6 z84C(`SnquScOu1f(vxdGoH%+F$!K;$=gga2HnooHi*_PSl*U`hg{bVEqBqV*P~G{4 zO98|?I>oEtG(BqHv@@i`c6-WX$cBu)g>1-ZNL%!Y`Mo#Fw?Ok1Z10Cmgcrj40}mDD z&Lu!3sg_RhgB~f)!~AQf=tn0N(3U#;B|)I)->t`%%E&W+d}N;=+F`n>O&;o<LF=jr zXJT%LB^eS-IKx0CP4h@<hmW8i?MB*ho`>saQgVHfGMiNAs^(F?kh`p_#r{X78+AGc zW>+DQwj2U&m5SYJqoT=$eF`<nc`JrF{96>;aCc9WUyByAE8iB<O2Ime(B-3O?i5Gj zj3u8vHPBqC5ABTx?ac<<6x6fAi|Vu@0lf2|N#EA#p8t1Z{;zS2x}ufeodS)GvQbx} z<t;(^(9DKgBsQZrgDhK|F?Q^9taXyk%|qbpVa_Aw8P-m5Opn4uVKN8Fh0{$z((a=A z;D&t<njg0wHWyjr&GQ4i2e(;#riVH6s#s_xIMAcO4RnLsp2zo%;IkeUs(RXci?Ye* zDNj2MzTlkV;PcGWpLEhZ4=vH3*RdH#ufDtPyz_k>@r$M7w|GDDBFT|1|Ef56`B&?M z?s87me&7tZs4mI{-!*iO0aBvtKzk~7!%ugL$J}ARh82a~pJ4rZChOR-?lz2e4INw8 zvDuexq_Gn+sDjrfVXC)HHgz&I)(OKtw(Fq(Qp2^cow1jz6f@az1>|ZwA^-1<n@T#x zjoqXX9DPH#D)fa57$<;d*hJ#d0w+<Gn%2DH^a`)7^zN%kFoHrE^@|z9B5a#oO2|vj zw3T45mcBm}B1}$A6A}wn1@D*qHn}FjMTqU3HI%y$qGjC0dT5FjrmF28SCiq&$Clpj zN)A`+(YgtV-pxJG4PoZtdE&MVn`Arhtc_NimHY-lWn(+Wrn2dy?Gua$(LnNz1x^J! z@61k9ymGIK)=&)4BB<qZvYq1eZsLm3A1hk!Vv5Zp9q_{@K>l=iS^?&YER<@F;+1JM zMn#|UmwLrEHtp!u<Ml76u&aNnCz^j5L?xwKqvle(*C6XEgWm97OQiK_%zJ!sgHj&W zDg=iXzrPBWZ+<$(Z&jl4{^Rq<op<g@Rc@M#+kPOmsTn<OnQh24xosNGqzL+jj-RCX z9>=aqlJ9f{+IrtmI%|{Rm{!$wfoKF>p`1cc2VDWX1$`@|%g#FsqNwewJFIBA&z<ii zy_5mHcyyPgaw~MYrTR|)&^83&5%q$Oa&m`LrOjUz?05sWCXhRleD#H-zjrfn0dhzV zkddA=>8p(U7j%cSm0RU4&!jwaVkqUD)>A4t^Do^-wo2x}covj<wR}BBm|kqB)8ZqX zLZYNmR?sCm_S`N&?n5!v`z&HVAtX+(6Czsf#K~}5c-{It$AB*rAtw;_u@Ln*_TI~b zCf^WK1~f4WI@#2`Ro-Vj6d(lMI+8D(>dm=|sFLg^Ys*J_@l@TO!kSKuf=;tupO(k6 zFORufB{Zp8`29Or0g@y>X}68dO1jqmi(g=GTpDFl9QU)-w9#0}5frMHXK_9w79;q* zeWcZeb$nr&Z2Z)rY{}p6b@4BdAN9VNs(2|S4(k_VkH0uh-7q>lz&0e@$Nn-(H@|_( z);HA80!h>enL}m4Z{+hS7f*N(N@G4>YkF_Y-Rd8(V;81b=fKykdFqhS0)6$H#x2VB zeMY${(0Is6Ty-zFN@1I3k?B-dWGa)RA>HqIEY76);#3~lfV1!|-!aWHz**V?;(FP{ zAy<3_azkg$q?xD<ob?vxtQIb*o-r&0qkCU)R&2KK^i#wa7Rn=;?rP8u*ypbz6TSOs zsZ7Y!66`w>HCiL_8~MH!zX{;CkY4F4=QmI}p7UFC`X)EON#pVXZj(EZW-X=X>oKz~ zNOvYF!>R8c(@8UdPRRe0w5;Nb^6<6S*e_Vv*b8hjjf;c%xd8O>Zg-12!SP;NBkfC( zZpB#ifeNd%=T(5dkl~$VVyQo%es{23?1&rWVmrl)E~z&-?IIeo5gX1Pg=b*gkZ@)y zA2-AvzXxl4%@*_nH?8qaw}B3K%m0o$oP(I9PUa^hrgid>UjK@qmu;F`V)oT;l9=rj zpXG6OLVp&~Fj!)izDaaF>2`C@g}7*J(JwLEC&qP3eV#P7kk(8(#acd3Mqk8z45NFx zFk8K9V^ce9emHA>+1A8uzNB+X9Xp^2hw-tWq|x9>z9LKa%yf&dLYv>%>=2AlTIU64 z2W1jgV84MV33Vv8cZ=JRR|c#J4zmS?dO>$=q|x^&@1~J0D)df1xWU#7YqrB%TIcyY zARDxew96{915*Xq(Oj6;b8$A7N^v8Nao)#Rht?8K0jp4ko_WM3&_sHXy_)=?hnGQ1 zuHR;VqfaB7>=OI>NKW+csi7tpdQS`Vnb7$XwMym?fSJm7ml_(ce}J)|q2tqaq?6Sj zI$7Ii%k91``@dniN|fPRc|Pv<%I#e5906U^AvR%pfK4{t-_|Lf<#W?B2)$E$m)|+p zDF(S@pX7EJGJO%B3Tuobt~q93w`25{$<GgFj&4y;SKBnWe?&Xo*Jgm`Rm=3#bOT_n z5_c)%=7b3{hYT_eYyx~1K^IM>a+4ZbBZ{neU+ZlHRcj~V*Rb~2cG;964#gBdhkS~U zWB)g;l}gwjtsIG8N9A6-FvUV?^i?&Dfd1B@=xbHF(dIENQD0#N9C?AhDOA-Yb10{L zb-@x!nqIwZORibs=65Ir<t9*kFZ?Z++48ShYA6i0T(I5M!5$zTx-xpZSAjIDF+aVl z!*W-j80gZNXb#|mI-5HvXXZGALQ5S!Ey6^<=Fuiqi*j2g#*{-}!MWL1_H>_U@0CMW zI{A#S2jisU{ws#u;e6bKI|Sg`uQ{%RWs;9f?1D>vUhnra%03Y@t+43%0W{~NSu5rV z{i8pe3387XhC5y2^*%52#gBt9M(E~!Ejvtp+oQhA?=kL5fj;6JoNPQ2<->2JV>3?M zU81dT2x{fY3o@KYD8QW;a)%t}HVUxIL7bv7`)utM%lblT7WipFhrpHu1cJ67fJW~| zn#lyM3N;Vd<#xz0M_hLsok5~|Pu2meJ2K=$n&#SRbTY>_Bqh$KF{5tr{+w;<g<Q7W z=-=dLpjDOz?A*D;Eq!wH`stx?*C&R%9=(8jZ$lN(bVFxb`o#Lqf;Kw&GJ3kVU1Rpg z3LfkDhTr-61$@wWku~*-hAxl3oHI7>X4wR3Y;?{-wZa><BJf&!s0^CCE$PfLHWjv^ z;LF_c;5kcD0DfC>>k)XAzpMGXWws194YSp#1%k@k0i9BjBfx`AxEB!VR(;?MvM3x> z8(o+~GiWAu%w`=sEx3EJNe!+vbUb5`_`;HVuWdhSiWa|yTtmlZ3$4xm)FPX$IIWmH z?6h(=*9<V_5biv#!ntD_S6eJt+bW`X?sd3RiM;!u6OyFzFDczqc*>vd72oRgq+GBs zyTGPs%-*}@SVRBZMZB4GZQ)+;Z8AC^A3n)mjx&=o)E}>=T*v0ua<BK+Y)ergSNp^= z@Y!#<JpIVY2OSjmwv-|Gf*IXJhFBW=V@bL;eXlGOJC#olbFADioBce}u;bJKjSq4f zpGJ$tnk3s^aaF(XK)c_C?5x}lxyrlA`xT9O*F|rcE2vxa=Qm6xUF-QpQqZAv?^mvz z4K*j{N}RSB+y^e>_X2or%QxU&9U09y@(uO)MQu-lo@otf8uIX_+Xv@Mx`ik8tD}L$ zn?qV^+Ngc=vxS-qh_i*oP7T7Y5Aa))-=UHFt@705C|;Abw((g~?U8CU&21TKG-`G- z)#*O*k9>!3xLvv>#w8~7-b@4S-O-FrW9}8@y`#Qxf0u7V+!M6Td0Jxt@9}wgLZX;q zMjHW52-N?3)(8G}_)UIa%uehx4$Om<*k$xLrnkAo&-pI2OVrU^T@i#GnQJ!rD>Bkz zZDdbDn=h{~9X5H3jONE0=xE2?RkCIm^f1fuyRm;}OzS1mF5-{(c^fwwm75!|mOKw} z?03f@=W%Rx&|HIhV3I5P8^4u`ZjY6E;S08<khx_YSGv7$NB3;pl6|S09UgZ$p4(1? zJk-}XZR!+%2r3*Q!UVK&IJ?Sb+HIM)e;m>)&PUHyV~;m}976kzBe7~zV*f>m+%eR; zFNK}<GS0${m6TH48332zMn7l;W*zZxmtnshXPIaX=00fMO?EiN^e*)krEi{*VtETE zUBB2*BbHuqJbdOtua{Gd?phx#L$0Uv$j!25@TQNVX>!)f7nva6gq1+wyPS%t8-sgA zuWrj>x+@cFS3R+~K}YbR{aBJpyZn)l!zE7aQJ~$2Mtu`$Czy`-wP=ISxZc2sJsfX; zfksj3-k8B<JqPP8Xv5qkk9!9PnP%Q#n%qPBF$%x~!?}JJX@6`+P8zLUdeMrn6>S<$ z*>k>EufdGmd#25b@xWyKT9Ss-J6brr&z_Cd?6q=vYTzpJ=kXJTJCyRlt>YZG{`w=X zD{YuV4Zne_NIUth!tnG17Od7|N6MgdjKZp|#Xy>1ELvI-m)10BY!?g8dX!5lAb+|? zYUB>u1(Ta3ts2KL*7fk?Bm1@*X>Pa~qb4>H`&*N8(dzb!sZO+i{O&^8CV696|B2UF zl(CM!aV=^=wqIRjiqeaM7ktlJct$wOW@Otk`MO;uw6Rzgs3y=ncAYT;6eaR?36~hx z&CJpYCDM^hH?F1i)nkU{bw+mfz&99WoFJdfF%cX^r>FnM+gxv3*ywvMI__t)hMs9Z zTWtN}0(hfaZdT&f43{{pn|k0%thVmLUKE8nx=+%lGbw8U=7B`T4BXVLJu6_mKJz%q zCoX`y9`TR;I^nFC0rraF-J>}DxEE>?*Oj1L{?+GoBQWZtzI7PlI^9KaNs<LL9ypJ? z>O9|niWXYF4LTcIDD2k$u-8LF)&{qHx<AIN*=UD$0n7kTSvbXp&Y$d~^ReTNa@-r# zX!P0a+i0S@RVVp1YBtK7yq<m)x}{nl7;1dd8Oegovd!L`LyW4Y3|6Q3kSjG9H?$60 z7J}Pk?W(6p2GS{h(@WYHOl_n+!6iP_MJq$#jV_gxTZ+_=eP5R0HgDGPOjo#dB-Tcf z>oE#?eu~3)ms4Ee!b%wGqZ;97yXw=<J8jR?`BmKOhm+#6DbYsd(-iky*IPX9<vecX z({!SJCw8<8ptT4(Nmy;0*R!X9Q9d%oW~bQQ$0o_PDYk>QyhPJAepfY{a<}#F*EGgN zXpeJ>BM{>9kWUvof=RdBr;8666;CHl53zp|yxApa_d{EpOdF4Vo6Rn{HgWn;y8^ra zL1Uew%gIO%;EGZ;9P1yjl_gI9-1Y$^;FR0YE6Vp7w+BU;m0SFH`aW^Wj6|33ZYXi+ zYPVvA3Hs=+*t63F=-Y5Yw%V&D$aJdBXS>Gi6raPM3+4{uX?~X71=#?~McFo_O0gMp z2=As(aSk)l<o&Fo$-70_Bsk7F!z}U^#9$b0_H7fQ101TYp<^`0-v{;LTm{WD4&Xah zKK<lPPO-&FS~TP>qs=27@S|02#Vx*L$ZaimyAE!HK*x`rVL_Tu1@_&!-`VmeHth@C zwuO<CQ&>8wisI|te-3FzIcPOT8V#Hd?h$oepN^4VR4Jm&<hI4Cq%zS)VjXqNnA2#9 zlM&0Eb}eGKlT&gh&y7oV@0PdPd|%E)uLr%jaI?T3aXXn<$2FMJ?6Pf<R>^z`+A^j% zWZSaS7=9D16h7TNHK|I7o>V2<#=<}mBW~*Ig^BB{xy`CZPXE1EV;s8AiFpIf(+9WK zcVb5GZpoi=iMcnJGHx&>-(ZTr!4!3aX+|ft`C(}9NjFH4)b4Zn=x6tN(an&)03WX= z)g~h(PrPh?=j5~G=M=MOj4JqWorIfDSTz&;&_6l&?As;&k<X=F;<(PY96}_yVbeRo zp8}*;0;)VVSM5W0rJ-L!9dM;#hUyXzU|xLm>dO{W7W6{YhnSzR7LLo}J39gHeU2uV zLOTZfc7!-K;|gwRIC}M`mei|}(1>d3c+8@>xIwOnYJN?a@T&7(hH$&bG}8Hdg=x$- zqyjfA1qP2Fs~)@dtD#CZW7N4D!yb*5X*E{)WL3Ct(j;?Oa5ftEghKDNBIdc2_A_I) zQBQoEEfD%H)MH1FmCq193dN~cdFWPXf@MzOVv197w-9j^qji<9OI+geeMO0}oTACA zWokBBt|srTkjD;{nN-cJNxqrNk|eWR=S^^HPV+X7X-4_?gkbFA66d)l<1~7>?cuhd zEZ^p-d?$D~-hB9~Z~(pSptfA)P|Q-=hrmoGv`G%%9X?rp+@wUQc)O^jL(No%8^=o{ zL5)*f(M9D><3E3Z8o<|sfIaI!1LHu_152_uY?6p`EYaw{&hc5jOPuMN=n$IMLzk?i z7liKC4R%bd%j;bC_q!hsz};mE?4AkH6YHi~Q@#>HpGonumyA<5u)^>78SbZ^WMtD6 zR|Li9_M2sOBwbHc4GecY<1SAwuOrC_4RKQ=Vm?8%Jng3Cf>Xn3Iovjt*T{n|=(Kc5 zln@=*WrNO|8fz-(*nzwHgajYQlhCY9)Ujy+#xLzpkrtY;n<>%YEP_XF=nYPXw1+)N zPP57-E_73|)9I13kQs^dai<X^HC>XVCfphDeJCU~x6rpml=i_A94^R<kOYTIv^XKB z8Fu;tjhChP<j{=78vTt~)>2~-+KDJv5K<rHRG7UTta$?3pgWLa1`axoo83KolhPP2 zI4dXz+-06&_S>J(MstaaR@U)=%hoo-e9Zc$HP$GKANNc$dl`pe-%=FMKnslO^ec-K zv7#D@l`0w~3!Pdkde!A@ChkYUes@PhsJSJ$AjE~fycul==@;tmq&{5Il|(00X#Suy zdV}Atb|<zup#z_!UR`1Ua%&dNZGGOx?ytY~7=GETuWdB0eX-ACbXrAmYmX5lcP*&d z-V=`dQk~F^M4arzxidNRA*VnW4fMVA##(Wry3x}zI>op86u5VjdU@92g;VFuQD>$S z?07unAW`xTB>p_RbEBZ|Rmt_KJmfGNgArGA4@s9zZ;MChl<G^al@6uVh}erb?M`t& z$rl)wI<V$HT}YbGIi2_`$TqzW8fhnvaio4FoA~%fL5G_lPrSDgT7*vdJ?7=edJHq( z6OZH9_tbljwFGT@&C8J&lnSXeS}SUV?)Z_=XfeOjf|?_R7e(Pg)-Lrcra^f6W*#0+ zwYkG<=HWH-@Wuo+BfPYrB6oOOoWa7n6s*NVSJ`fqm%<^O7BrH^tD8BT=S~C3#MBJp zZ|K8u30#)<_Sb~i))cvo)<m09oOZ&uzt%*x1$;nz;AAt$N_MDET50X{Mt3B8t;UY1 z!cP>p^*jbWzXizCcliFZQ#{C52Ant_H&Qdn5#8Y>@4$@rUiWC#&_*}IG|zL2Z}d9F zXM34B(7_<BrN*sDw43f{8;-p~6~;=>_R?CoQ+%?Q#-;7p3HRM6iWN9NrRMwL>Ot$H zkL<%LP*YgeICG@=5Bn$N5;v~>%13#K_j(Ct+B4yr>>4o>2Pgonk+0?M7tm{c;8HYp zSh26ag+>{y@kaNp^ICDIi((hnlF+LuKT<RYp|4kVVf@vK(Zp;v?E~CG>DFlXQw3_R z*ePDvhxV8162`$?Q!br#^2S-GU}G~*JBeau_mDOgHrwINIdZf+*Y2emb6OZ?ODyfh z6tB}xaftiNvff~a68t=;jn2MAV3bewSYaIM$ii8OklT{43RrNOgBWB_;k+qk@;~ch z)(w!Hyz%Um#z?29IyMrISUHbqxiro5Bn6#y;7T&?I$)<X(U6C}`=H096XK!i%ep7! zlFc-R<l%TLinK{P<D(!~?`7P(U#fR!={~5mkvNn45>LS%z8Zi&yk`u`nk31hP$#Ei z#)~_oF!NPA?jKXNtQ6@f!W<uU(U0DjbqPrn=Z2IH%#n!Cqac$PSjnZESAqt}z`3~{ zbV%(g$@#q3W&k%<yW{+A577c1n|jSgZ_jgzirioKLw>(ce7FztP{@sD&?2?AX&t=W z_}J;k`_NiXmXWrmO;HFr-R<|Oo`sI_W;Q#=mWY*#KJm}pN~7{AHZ$F}HzgJI3p)F8 zMojSKYvR7peYCkL3%V3rp|{CEyX#YM-`NDCKX^dn2sO(bkaJHGB58D$2TgNMaXnT! zEXEOSJ{nP6gOjLA2kS`eO2??0=0h|aq7%=`9ce}y6GP{rq4w~aY+7L%iWRFO(hJxd zwBIRS<}+rb9s5PniUP@5Lbvhc>lYMgL)SP-Zz^uevgKlqd=$6%;a=W0`cmf9n4kfR zPHb6->Q<Z}{>V1LeDI>T?<8Zrm1dfKII|kwHr*WP^2LlL%GR`Bp_^*PP7CR$GE5)S zqF$Cl(&98`etdrccGI1r*>w*2KvZaKu+e5&RTm$T<(mavpo!iBu}33f&B1`3rG(=M zhbf@5NyK?&*^XWNiP}ig^oY=RsBITAoEU@eAllLYSf*fhB89!gj*-bn<tZ<RyqwZ^ zeeGTfZyV12Jg`@RS&%6H2>T{U*J}2%i;rN7nf#A8z2#I`C=`kVdlcMOf!$K-Q)4=1 zT491Hz78(&=QguC>q9iyJM9sNb!8k@Zu@jhOVE1wcIPj4IF^JA&%!(e?OizS8F@Ly z$=xKsNVBldo#Za*TJ&C8-TJGO;+=Vc-cLDYJE&}D_UrybYh`hY36K)*{p)bFd(^HR zaQD+_Ur>M5ehvNY3$-qzJE?Vva<?uQxm>$boYM^|(!vL|E`N1@nbkekp+Mc-sg7$S zi2`b0NH$4f3~;pIK3qYDJDkzFc-j`TOM|-bCil%8w`yg$6bt$j&pLo8Zs>f1pEjWL znel}mI+t436yoM`%dgAXEX_Hc@fqW|o6c$0jCsiXgK-}^O^_;M!vfFIdL1;g&k^Fs zSm_2zq(-*;q6}*of{!<sjc@;mO&a<!$)I(f`OsMm4Mp!@?Uiy`VV9e6Yi28%M{*ft zqy3I_!7iJ0-O+~Cbm*9#bcJ+mos&<x?07H>H+0}UCm)B0pM)Oy5$6t<%BFXmIJ|Zg zZoQ%P%lUO|YP(HS7l=DMgcA)Zr`@;RT(zIOK=h8}K2G%e_#^l6o~;?&<?-{T+s_sI zn-?Y;m-e4Cje?x4bj~*xb#RM~&Y8~OCo)O5AI>ND$il-0oyQFP)_Kexv4iWI!%1IN z06&k3bqTFE<W9?+7Ra<FL2e&4+n~aC-bSgY?MS+|eD9p>Ipzm&_LA<vlur9H3rUz1 z*rKyLvC2<hXr)P_a2>+RvV{+#?cMGhPrnA-g0|;9w7E~eD!DwYmr=hTDb0^^pMLGN z1|h~npd|~Gc+S3NSm&7IO6y8f+^1o?vEHmS(ur2er57+Sp;N7*7~LoE^SK51@&aZF zySVMtK4=Rv`eQ7S!Dr<pLtG2+%#jA4NfyQXodNu;s2rz5p=}u_lLyWvZ^k*%8~fIQ zbIDSl`ounkQMF4H^PN}$Tsz{pYFj=eqrJ|lAg8Xuyl{3ev~D?$I~%o8kf_G^hjr{f zj(fI3mc=_%EqBB1&~tPvhiZ41nAvN9j*BOqqoMyU2zPP>8*oRc!zuQ-s70YK!Sux- zOjK=!*19Gd73@;8&2sERV7`jGle}KZ#Vt^(UEN|$XP#BSt{&*eiYtC0(LGj+u`Xsz zGjP({x4)m&Ag4Ti{ljQy=v+s+^*VGVc^RuhIz=N|!x`3T##JFb;uB7lRnGh6H`*V@ z7}T>;?Sx*CUYwx%_v6Wdu#=1#01E*30xW=^0rmin0nP$00lERV{h6^afF6(ySPHlo z@DN}FU^`$Jzy|mP&;ek7VQeHI44?%V0e1pc04e}=fX4va0j~jUfU|%v0M`Jr4;c#r zgaPz`Jit8w3t$`I0N{6klYlP(*8#q#7z+W+0?Y+00Q>+@4QK!~19ky^2{;b;1n@OL zb{c5}Oat8foE~9d>1hVGDcis<=NkGy4@oyLUA=+DjU2F}kCSQ`)8OZx!qT#mVohzO zrl`84u(m`~Rb5$BQd2X_7wPE#wz8yFQ&Lx2t0}51F45dmU0FWZ-OQSz>e8y(SygL( z$WjX{Dk^I=l~pAb2;P^4PGEqlHMQo-idiLfB^0;Y%{`?R#hN_+1%a0ot*$LxQC7lz z!A<4rvSJMdMW2XL#>!a@D`J(bnw8*h7At0D_#?N~=^!poq8tOXiq&OhQ-N6pTg~0T z;C{Rq^I`(lAer2YdCAm@^z?KkJvuGRBRAoi*t`O76^qeo7w35+lQb%_R+-EuJYa~b zIy@@4VBSon0#f0Rj4Xe31<R?dU<+55u*D_CY@vBIGgg<f{K8uLR$RD-(RYsFriNbN zu0nca<i46)A}sjh?%;QIHGgC5_QDEgELp*F3aeRiRW<M$c01y{eRUa2UcHj#msGLb zqFQ!G<^3$Jq=?+FF05WdeyaHk!iC==Gcf#@Qr^KoFB60T>R`Wm<?5PRq@|>)wxoPT zNj2;cW+lBLT#prn-~XPR1HK33<jgKEp1p>LQ;cT@jxOiqXy|1P9+r_2UtS(xLq*B* zQ8E?4IVexU3t=Wg7UQ>=o6WF6KA^Nqf%91*16gi=#W3+`-2Mm5QaCjTLvkU7SAkFm z>=rT#yLym~CmxS4PkiKR!0vX0NwgXf+6v$tm??jfSrx}*CaP|Cr;RY>aWe2q;C%S2 z0?q{&Q(Epo+V2NWgMAUO6#i-+DupA(Qw`q~k0-tKUW62Q;w|NINOAI_<nfoe-Ai$= zMp`LG4-K`5u^eeA;dD#%RQ8)Cx(2)O(0HR=GID^PJU7k(o{jt}#_t+;{A8lP8BBw( z(x0Z^hFnQ5Ggt<T2TkSpt-&8XCCKfWY!UJe?KtvaCQ?Rq^Z}%PCQC*BF?JvFa3;%Q z3;OLBf`?Eke~JBEfCexFfEm9+>E*5R@%8f`GIW?a;I_cwBSwx23LZTsWbC-{nh6s_ z!zN9h5<Yd>^cgc}&DKUlMn&uNF|l#+a}pBgCK-}bQq$6n^D;7T&&tlZBR6mUg8YSx z?p$23<gUAyF8jf9Q{jrD;*xt-noIA!udKYHvT9XzP3`LYe^|HXfd?P@(Zg#&pB@_m zS{BKMFkeutVfUciDv_#M@OK6HLj&HZ<nOh3uR*C-ahqzm(7;6{$C967<V`UT2}$LT zC;Zs{@I5{#7b`gj;)o-{twNkd@J|#_TdLvQwGuAMd5+h@4bgaGxN-l5a4F{dk)mqE zQ_&x~6t+Zf1aicaABEsQqNf(^_Eb=123<A4#HAFH22>aF)_ic<J>ls4!}<Q{u0<Tw zmlPr|i6^Nn3f*b<gd5WzF11%BtPc4{wUufR`6@@gmBCaB7#tdvQxUjR19#Ot2ddp6 z56;&JHc(!-4&My_g^2SXg)>k-6b|KO8GLF$RV98aIn`1gQd!i%M*2>iL}f%AF;MCl zlW=~GWYPWU|Ni;99HC2jMY%GY=PTtLnTR3}b+?L7*B@UMa+XR*<L04Sn5q1UZz+vb z2Bkcv0nQi*(L?`#g)gYBEaqWr@LR#@F6D8TqV17tETwQDwt@T_;Fs^8U&Jdv{4d6L zBma1E)>H1^rk?WC!&4smrM!w7R2NfG{tMyKlZIP`bF20zibeF7Uovu0>SwBe|6_`% z?hs|3c*~I^QrXiN>UD{Ssmy8I=L_1*$S-Ogh%zcGY8xmvvMU6v0FO|cO5Zi;W2gm` z+B#}g%ldst95k!HEIoNK&`x{u;2*c6Qk^FrrL<7YQVUyt3!d@B6ZH@Bi+XMfEeE|| zCWB%#q_h$#CcArhyHbuf$|Wg3sLdoF)VtFdfZ8=mIZ;FTL2U!ooBMeP17Xp3s-L&w z^Zy(9twCytD<rC^ys6e{c*)!c+9cXNd_lZGJtDQV#0j|Ujh8r$|2-*_xWtoBGkHFh zqpWFsB(>GyXp4$qs^<O6w_A~c{3H(gc1}^dSqtB*5el`d#81-ifX_69Uxv~u<aB+T zuLjyvqMP!cLZw_F?yYdAZ=m&*`oEPtw3*xm^*Z+>d@55<eIMwt(=fWs!H6>xqoZ5( z8N@|*uz9!qwh;W43qH%g#aB;TL8&JyOL>1jI0g;x*kt&97vn9O4~4&OU_QVWU>Z-H z0#*ZS4jEVga2@b%WDguj_HB^GAba3o;CA5Az_GtFura{9fJ1<T4jb4w;9}tMWDl$X zt~z316M#<vPXvDV*9P=DnAhXJu{FSXzz+bI0e1s80QUhm0x!5JUFpbQ8n;v<L|^>n zannlt79!>GJiY{Q7rF7+N<2fOC=CzoKI9a&>=kS-V!?c$|6%^mbAwx<tf=jxP^eG7 zhnN4Iup@4ldb?CM9e<i{QJ4)^D>yx#xdDZ!WbCM)6f_%)cZK`?XM^6K#5<J_JwF-r z{?kG4jf39lUKfx1&4b>X2E8AU4Y;AZVLa~r5eLFzascsym&Nj^rQU)GxcpJeqw6fg zl}gOOA9>^v5U$l)@+=Kto$x8Kd5bNWUt<!Um)8Jqns7^l1-=-j;bya0rSh(;s`_D7 z)eZA+eEwhmXuv5q{)J;aE&bhSe``|)YUqFTw}E~8??(6aY~W8|-|ug52<zCupNxIK zKaYRS|N8Q0H<dn>vibit2MG23f5P{CJS9kYoiOkx6TaV{$N#Ol`afg)k7@wLG#r1P z7|As7u4dme!ER?ayZ?Tv9dM;)1MkwCAW$W+)UR8=;gLsw+_3Sn$DereCqHf6w7F@^ zQ$KsUdF!^8?K_@%w)MH^U)cHL&tKZL`{h^my!wm1`>e0+KXCAuuODjr)!`#={QAwK zzxnN3$KL+kJMaGf5AVJI!5{x*vmZZk^3Q+y@YLy#&YV5>*Yl2#Kl${t&%e0P{^eH} zFJ1onZyi^z{{7lF*F~qRv#YzOx9`8b;PTxID&K3t<zJote|7x-?fm~o3tr#-oiBL( ztJ8l}#8}g5;H!t}7&}E_<!u<C?#-PY(7t3Rjk-RMstK^Ga$L)s$4{uDG|Ps5Z0W zp33U-!rIcx3R*|Rx9q~2+T^0z()&yDDyvpkaXZPp7&{o1KO{Hqy$8u6zm|K)Y&I8T z?Of2XkcA<vRKCMv#D+^GR)%O@h{pM4ZrVJ%85k!PmD3V9j@TF0a_rtWnN?I-&dp1) zj=QD?>+=gLE8!xMEN^<snR>z!2w~p~_|mIg_%jB&IT%b|>BA{lJVneBFb9XbmIGD* z#+~HW>}#f;m<2yS1DpqZ1!!N_E}VD!KkfEk#k5iHbnp7LqVI1?^7*4_xUUMhd=$od z7{mtv=<#P3wI9L|`g;0?vZM6Qgq}XK*Qg*yeC%Z3u~v0Y-x?m?Ugyo>T^`Ta4h>`P z0O(nV+iTzH-i-!kAWr)P$WCCup9z>v1Ajb=czC;eWqp5>d)&%kzZV5@5ioWVcgB8< z_bx!7+njid@E75m6>!+?hJ5O|yImcguqo|PQ?RxVSOV}o$-=$~?*w;K_Vwq{UVQgK zevJoso+*lbQSHyP3vkIZo63svI$p}>#+%dO6N@werUK}>5W`p>Aj)lC@g4p?#P=@1 zkT}WTOL+ePFv@KXm(sO;FukvX!QKX(9>i!bF>TtH*`Rk<6$r);f+L#0bo0kNDV#%t z!x?5^Y&oC?;CcSQ_C+ZX%qtxT20s+WIfU^J_x}nGiVWo2@>IrLfGKGn-`KmoMLbi| z8H)hK0X)w();h6!S2xc_%sthz%PI<*9Y*}`cz5sako9fs0IPWTct<8<A|U2=DTE<X zJPm{Csl>Nc04jUJ^h~)0J#AU2cYrQ8CU<vocYB?K!#jtjsS;Z%YXF|-b=GM3DRZc( z4&ExS_sF!1TwX`IyE*HKUPq*=%FBZIXDR1{Z`Z5Wm!Yfx0Y8vplHBcf4(2mT*Ms=} z2H>3A-BgLM4&CgoX*pvpfL8$YV4klj>)OTV*FLE0-prxsMso4rce7c6?=rLnm%RJr zXd2LBS~NN29@Pu~eI+m#4Kh>sYnVlw${b$4aHQyK=#W|=?DbQ5DtKn#_dMq($_GE8 zQTq~ec;D*V3b0EI!e54b?mpAqcc#0CgBe?FXd}H4w=e9wy86HH`K($7TFsOn%I@=u zzB8Nz5C2?7yF6(%WAg#@96>t>F*g~U!WZNM;7`TLlnTsK->HrCWe!I9Fa+s_!hQKA zQ{N>MXd-`Tw>7sR952com_s>VkMk4<(@EuXLwiBxSn?y(Bfv`ldVaysF1d*znyGEf zeVDP8fO%`V6E*_xv+<tjHj}NpUHulHJZ)j@O~3^JJ#!^G`aEUh$(O&?W8Zuo+ARP* zrQF@O`SVN6`p0ZUp9!F6xZI-l#WBVJcmDke`MD4I;O#aahB<jq{vJkoKO#81hTbBN zDZFps{%>$U-t9k!?VI>cH`*JtK^|IvvmNc}4$uJbJkU}Z<%=+Psj1mhbN-?}^$vuW zF)02l!J@uz5Pf+9_|l&fgWmzZRGsjI40)DQc;7c*9{d(|lKoo_2KjR<IhZ5DypoEN zYDll7R#wzhmX)N|R+pvUUs8cOc+oxTau3jw8T*qWzod4M!;Hd;;xb4#q{=XkBRP^( z$hh>&lC&uo7nar<E35NMD^`}3NMl5{hTP^<7OyTVq2b&eh2<p(IY~&bs4b~ZtuC!C zEh;R_$7m9xNXGWdvr7u^FZq`JNC8q56j@~{`D1h7f3W#S1F=X%rem<mUL#wgFS)q5 z8lzZ-z4hd3PDgT8X-)DS`I+ovdCuyx+R~IYwIvHH7nc^7q?!w>*-G+BquKQ8>PiSM zlnH~yW<EwPBJJhn$dByO3M6QmGQX?@G9_a{XITky_ojs9$TLa`tBlnpC5)|*XI3ED zg=M7=-0Uv7qBy^*v;q=6D3Fsx0|v;|wX3UWsJ)miA{)xZg=?xx*hkX$VkyClE#u+l zRuq+_a}l8udSz{j1+`_1Dt?IZcX}Pm<a8vLl~oq8DdazOb#*mLf1w!z?&8d1j1rV6 z^Fb+ppQkmC2w*$NM{asfY94wzvQMVB_43S`JCT}V&JCC;utW0f%0lGKifYKz@RArm zD6YK1qWj<qk>yfciz>{Vtw3H8Bx%3~NFkN+OM<biMk1B%qIaHsyXg&4BSy#$y-X$q zBAFhbSZ?GsaKYb{i%}Z9)Y<Fg!p*T%B4~ZdCcWbR((1~Ja^ysQZ8g}p2L8?{J?yZs zvY$uTF9jmwRvsc0^H-NtugNQ^=F=i%J}*b4<O;<hO+yxzg8yrH8RCr%mE+68(xUsg zQ++g6-gyZvD3KEGO+MW<5D5eKd?WFmRC$s6dyoUGYs?g4%IbUWDX9jRpXc%Mgb=47 zEiXdytGuePx<pDIIN|5=?9`mXs(!N%l?8?3u3~V)7I0ef!KWBSpp?@}R;*sRvZOi> zm5G`RUq$Zf+N#yH++GR^aeXc2x0~w4Y!-!_U)#^8KVhk5l{F=9w*AYXx!z)ymA>GP z^z5j}S;b`#2g*_`09W=0#B#Wqh-B<xN~2WPQb>sTI<;5n6~(#tNNzI84ZSAUA~RO3 zt}UtI+~|_r^_Tgbh1I1bP=|);|Kmr~W#H5kmR7dhiBW$$Q8b1TzHQxaL*EJh{ro!z z{xdn?;VBRH`1P1Q_`B@C>-&G!y(b(G_W1u-VhnxzEWZDB3Mefj0iL=^`-Jqa00aS) zfFS_L?ehIYZ(!O}r2R$0K5k4T&^Oxq^n9am$uHqy01B6y4YH&CXWDxvAo~dbve&uI z$!;^28~As0O5D!^w|%}Fqk-n(F9D{w(ZKU?%7Hb2DnJMT!!2q56PW0+0Ep&#H(m!! zX;}}T?;8L_5B6Rmt-#nbZu4`%MDI=j#rG0`+`SH<H2o1k-#-M<_aI~n<&!7RqF*zx z1OSy=FM!fV&mP$A0~`Px0vrJx1snss3$OuB0UUr!04IR$H!y#I8ZaCX1PB3W0AYY| zzzl#E5Dkb0BmmL?d4K`{xi<mKfGR*8U<2R@Kr>(`U>9Hy;1J+_fWRrnK0n?afObF! zzzJXnAbS8%12h0FzyMeXFazoUPXM+6wgYwo_5cn5jsT7U-UplnoCSOaxCH11s1Jf( z0J#qbjs_S2d4OU-EuaCg9k3Iy2XGY74(JBZ<Ds1!zT?OAx#5N{{~a^McXOO{$EWAf zzJ+{!2W9hn<j+m<dfX7UeIeyLPPeHV+L1m~RMWaO>n6Az{rtT2^4yCOu7B3iO>c&W zEgbKH``^6q(F+>s^S6HMdnGG_8z20h?vvf_e+l=0dj7NLN3+kLZ-4&o?+*Xr=eUpg zXjtZd^n;HyZ23p`eiZp__a{!_ejF?eJ?x?ETTcE-7V7VOqzE+M`TUaz_!kHB-5Y%p zVc)&c^e-m-pB(*nvVmHP=sVd!^G_z^UmM*2=j;&uwt?O8h2gL@_{}uxV}t7;%l18B z7IK}S9c}X=>|OpNSnGZ+!Tk}q|1O}mp4#|G&_&|{>hu4#1^my6{U1qL$ZmS%?#C1R zwLhRw1}NUc7zRLj^Y7<>UJeLo{elZe^gIcCrEpZwBLNua!aM{6_t^KahXtHt8s8HT z$XEf)r-7>ok6>)KDFWvn(a)Q-J*B{FfL{e(0vs_4=Pcol_Nhmh)JzAw4E80!rNCQ( zFT?-XV2oQ>mGB7gH<k#Qfc?p%@D~jHKClk>6fo`IWSWxLD&WtHe%VukLH`c6UpNSy zY}(h8JQjN=g^@j%fhnHEao95iUIUz2c%WzMc#Jh*P6z%R@%|aO9pTcx_gK(32?MQU z`VOpqU)t*?`|^p{XF|O7z&lL(p3}fjnRIMssD$f*H^Te@aGNQzXKEPsfe=n9a4f>1 zeQ!!X?T1eSP6n=mJ?(Xqy&bp^?uSe!9K|w$cO$$PftP^J%fQWWPkY`(&l=!3(6a;h zDC}vEo5INf&O|u0w{k^xT@Yq4_6W?Gz%${##Et8L(_w!QxYV?|=L)dSw6<r+OiF(e zn+ZImFp9kaO!;^jcoVP=jpu2k|3%>T_u(c6ykUy&c@mi7JqXM`koL=o9@-}-oCzEY zd)f~tGwp*DjsSie`Sl|38%SqBJf%z9GZT2oipZY0IdBJ@nSi~~!swp#M9S9)wh_1r z;n7|>g)?<7g`@4+1l$b!&yyHC1YBc~zCQx|Hu&osU<d5CrZDCNraf-*pAJmrUJ9Hk zT$K$;XH4@)X>Xgp=fIo+^A01<Py+uRcq;hq9Pn;dEhNsP{L}U<0X~O(Ta+Qyhu;93 z;GXuksoa(UH^96Gn95@Za1MJ@q0Ex_bQSPwr0-SWeQ+0$O>`k2fHPrV;>MeRiC;bd zK1Jc>z%9bx1RQ~IcLOiN_tU`aPY64g+$Z78vc$*AJjjs1oC8dJv<g@!)C$4#;jc*F z^Y#KVR|`MF1iZd*bx+Ph#-2m`yMa$5eQk@7P8K1{ypzf;itPqYEY$ZbS<F}u`1W&P z4dPw04097;+W)3}oCIu!nfAHK>;fkLOO``^8TPcVP4)+Y55fFr;A6mF0-pr#0saiw z$3*_LJ<E!4KAh}<6*iPhG17{17D|whz=^;?u#dY(Dz9?j!omnPVI|e$2!`XlEVxA5 zBiswQXt)#ZW9&&*Ez1PXfVs4s+Lx=cwhG9>!%T8X4*{pILYT;hkAeRTI&!KRdlk41 zI0tHwK6m3+Yrv0ie-L;R;uEk}_PM26s0VI^J?&eMFy-}>0KW_Kx%-j7>`Kr4A4=h0 z2A+@dnNUaVKoVO7d<yQatbwcy;>&yh=j&lE0qzE_2Ugorh7ThDfnNl^jQpMX5Y^|% zp0|O|!C&H!kY0SJeQL_@kAVwdrafpf)7~`U65tZJ-wGT7|A`iq6Wm<@rtdD`Wyt5k zdekY@gI9qM;XCa+7c#Z54ES@u>#|i1sCTfZeP;5v2>3@x&r`sHP%EGM7}k@HBflF_ zt_bJ%z(Fvt+6>-CK1VbW|0l5}z~Qj}d<)tWa^DQP$=x=j5Bw^$P<U5*HUd*RUBIh> zb=%P_5uXB^;hy%IDc^H|r^^1`Q~HdQ&ffqx;(O+^IPU;_88||yl|9)i)yv-l4-x*} zGygfN589p=fe*o5&Q9c=5GA_|{4UH-y#xRseGL4f5FtOf3uR+^t%v<jebgk=0bK~I z&aS#t?X1?;#Mb21)YdfAY^(Ws&5@eVYQky@YIoKis{OjwviiX4qpMHqX6Uv0XuU~a ztlz2Mr9Y)t#rVg}hzW_+#H!<l#|6bb6laN(JrMLj$Xw0bu({!LYv+a}X_CT{3`vKQ zjwBsTI+pZq()&raB&LzhE}Yb!(w@~iw4Z6)wU@LV+G|>;wjgq8q$#pE(i~}vJQ*1l z6&_U=^-$EYsCT2Zx@g@o-MhN?bxg0&tMmzagFa2aUEiv==}+oE)3@u*F=a7TF|{#U zVwz*Z<7dQc<D=ta;}hZy@oDiH@m2A)@pbXn<~Zl1C72Q(O4yUoo^UDQK;of9ro~Pg z^5UA_sqfaa7)6XK#uBq3rXgluOhT+7HZ4{Y7Zw*DHzRIKTyxy^xYjsDyei&5J{lp# zCMF~r5;r7%me`&cHus6SjwA$RKpOz`kk;Z(SwrL#k&TgCBDK-c(Xr79(T3>a=rmo1 z&Z6I-Z`L2xAJgZ>J``(-eIm9wc3147*dwt-adv!O{KEKx_{R7x@y+qa;%)I~<J;q} z#j`mHa}0A1J*Z8HPFRYxG$cHca5Ujq!n+9;P|}e2MB>TBjHK+OyrhDprAelw;v{oY zSyF2fCDIJKm^MM1p*3sEwEhw5h~W{YsNyJdR9RG2R4sCws7s5^h~6IE8oe_*oR@hl zayw0*5tAL07qc+tRLt2JM+~JqEiof8J25YDVIq}z``k-&JLX=S%S>pC5DmpZ98;_} z>qAg7&iL+lQ(|!<E#49xj!6Hg?x@=6y6A_Zm+DNq;j!7Vd9g?0j>a8}dpGX=I9uGw zxKnXw;~a6H#kI#>ip!X@eNO9~kOWOaSVDNhfrLW|N09F5#Ms1riByiK63-^)B`tKP z8WC7{QQ-Vbv^JLWS9rvX2yH}mL|(+gRRxiGu?u4hVwc96VvA$Vv1PH@ad~mW<AdTu z;x+MM@$lb>J^?6CyHH!8HED~r=E$<h8Bq(PY|$s9Peq@Nc0^0Qsg#z+o8pV(&GBXN z+Y?$7b|x5-(vm()YA1eZMcYOw!jrd8#5BghVjsgfV6<<Xs^|zqL|Q~f1m!hx_5swH zW2i4Dlg=WXOG(#~x+$!qa1W%=`fG=4L$qPq8Ax4%HcguiDwl#r;&?c4pbP|HtxB7x zTc|VZ%5+t_T3wy)A)Q6HLD!&rLf5F<qHES|*R|?)>UQb&==SLj=nm<Q=#IMUnN4?6 zcS?6w=g@toYu8=Ub?C0?oVspz{qxtW^&xtVK1?63ms$o7<r(^HeV%@yzCgc}w-#o7 znZ8P2tFO~Pq$iGV&_AJX)NcXjQ|;Y}wq%cfpZ<XUkp2j-3-9W$=@l`<W5Qyh!EL6P z;uxyg4XD@q+<g9if-T`>!l{I_366x%5;_vDB{&nh6Ih}mQI+VQs7@T7s7VY<3{RYq ls7)mP@bGHE+@*6(bBpI9U;h34I|u%q1OLu}|D`$be*m(8q7(oC diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/gui.exe b/PythonEnv/2.7/Lib/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/PythonEnv/2.7/Lib/site-packages/setuptools/package_index.py b/PythonEnv/2.7/Lib/site-packages/setuptools/package_index.py deleted file mode 100644 index 9c9d76a18..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/package_index.py +++ /dev/null @@ -1,988 +0,0 @@ -"""PyPI and direct package downloading""" -import sys -import os -import re -import shutil -import socket -import base64 - -from pkg_resources import ( - CHECKOUT_DIST, Distribution, BINARY_DIST, normalize_path, SOURCE_DIST, - require, Environment, find_distributions, safe_name, safe_version, - to_filename, Requirement, DEVELOP_DIST, -) -from setuptools import ssl_support -from distutils import log -from distutils.errors import DistutilsError -from setuptools.compat import (urllib2, httplib, StringIO, HTTPError, - urlparse, urlunparse, unquote, splituser, - url2pathname, name2codepoint, - unichr, urljoin, urlsplit, urlunsplit) -from setuptools.compat import filterfalse -from fnmatch import translate -from setuptools.py24compat import hashlib -from setuptools.py24compat import wraps -from setuptools.py27compat import get_all_headers - -EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.]+)$') -HREF = re.compile("""href\\s*=\\s*['"]?([^'"> ]+)""", re.I) -# this is here to fix emacs' cruddy broken syntax highlighting -PYPI_MD5 = re.compile( - '<a href="([^"#]+)">([^<]+)</a>\n\s+\\(<a (?:title="MD5 hash"\n\s+)' - '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 - -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): - scheme, server, path, parameters, query, fragment = urlparse(url) - base = unquote(path.split('/')[-1]) - if server=='sourceforge.net' and base=='download': # XXX Yuck - base = 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('.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: - for i,p in enumerate(parts[2:]): - if len(p)==5 and p.startswith('py2.'): - return # It's a bdist_dumb, not an sdist -- bail out - - 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 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("""<([^>]*\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 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 urljoin(url, htmldecode(match.group(1))) - -user_agent = "Python-urllib/%s setuptools/%s" % ( - sys.version[:3], require('setuptools')[0].version -) - -class ContentChecker(object): - """ - 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 = 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.python.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 = [] - if verify_ssl and ssl_support.is_available and (ca_bundle or ssl_support.find_ca_bundle()): - self.opener = ssl_support.opener_for(ca_bundle) - else: self.opener = urllib2.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 - f = self.open_url(url, "Download error on %s: %%s -- Some packages may not be found!" % 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): # We are in Python 3 and got bytes. We want str. - if isinstance(f, 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 = 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) - if (s and s.group(1).lower()=='file') or self.allows(urlparse(url)[1]): - return True - msg = "\nLink to % s ***BLOCKED*** by --allow-hosts\n" - if fatal: - raise DistutilsError(msg % url) - else: - self.warn(msg, url) - - def scan_egg_links(self, search_path): - for item in search_path: - if os.path.isdir(item): - for entry in os.listdir(item): - if entry.endswith('.egg-link'): - self.scan_egg_link(item, entry) - - def scan_egg_link(self, path, entry): - lines = [_f for _f in map(str.strip, - open(os.path.join(path, entry))) if _f] - if len(lines)==2: - for dist in find_distributions(os.path.join(path, lines[0])): - 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( - 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(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: - try: - spec = Requirement.parse(spec) - except ValueError: - raise DistutilsError( - "Not a URL, existing file, or requirement spec: %r" % - (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 - - if dist in req and (dist.precedence<=SOURCE_DIST or not source): - return dist - - if force_scan: - self.prescan() - self.find_packages(requirement) - dist = find(requirement) - - if local_index is not None: - dist = dist or find(requirement, local_index) - - if dist is None and 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 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=self.download(dist.location, tmpdir)) - - 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 - - file = open(os.path.join(tmpdir, 'setup.py'), 'w') - 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] - ) - ) - file.close() - 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, tfp, info = None, None, None - try: - checker = HashChecker.from_url(url) - fp = self.open_url(url) - if isinstance(fp, 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) - tfp = open(filename,'wb') - 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() - if tfp: tfp.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, httplib.InvalidURL): - v = sys.exc_info()[1] - msg = ' '.join([str(arg) for arg in v.args]) - if warning: - self.warn(warning, msg) - else: - raise DistutilsError('%s %s' % (url, msg)) - except urllib2.HTTPError: - v = sys.exc_info()[1] - return v - except urllib2.URLError: - v = sys.exc_info()[1] - if warning: - self.warn(warning, v.reason) - else: - raise DistutilsError("Download error for %s: %s" - % (url, v.reason)) - except httplib.BadStatusLine: - v = sys.exc_info()[1] - 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 httplib.HTTPException: - v = sys.exc_info()[1] - 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 url2pathname(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): - 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 = 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 - url = urlunparse((scheme, netloc, url, p, q, f)) - 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 = 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 = 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("(cd %s && git 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("(cd %s && hg up -C -r %s >&-)" % ( - 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 uchr(c): - if not isinstance(c, int): - return c - if c>255: return unichr(c) - return chr(c) - -def decode_entity(match): - what = match.group(1) - if what.startswith('#x'): - what = int(what[2:], 16) - elif what.startswith('#'): - what = int(what[1:]) - else: - what = name2codepoint.get(what, match.group(0)) - return uchr(what) - -def htmldecode(text): - """Decode HTML entities in the given text.""" - 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. - >>> _encode_auth('username%3Apassword') - u'dXNlcm5hbWU6cGFzc3dvcmQ=' - """ - auth_s = unquote(auth) - # convert to bytes - auth_bytes = auth_s.encode() - # use the legacy interface for Python 2.3 support - encoded_bytes = base64.encodestring(auth_bytes) - # convert back to a string - encoded = encoded_bytes.decode() - # strip the trailing carriage return - return encoded.rstrip() - -def open_with_auth(url, opener=urllib2.urlopen): - """Open a urllib2 request, handling HTTP authentication""" - - scheme, netloc, path, params, query, frag = urlparse(url) - - # 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 httplib.InvalidURL("nonnumeric port: ''") - - if scheme in ('http', 'https'): - auth, host = splituser(netloc) - else: - auth = None - - if auth: - auth = "Basic " + _encode_auth(auth) - new_url = urlunparse((scheme,host,path,params,query,frag)) - request = urllib2.Request(new_url) - request.add_header("Authorization", auth) - else: - request = urllib2.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 = urlparse(fp.url) - if s2==scheme and h2==host: - fp.url = urlunparse((s2,netloc,path2,param2,query2,frag2)) - - return fp - -# 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 = urlparse(url) - filename = url2pathname(path) - if os.path.isfile(filename): - return urllib2.urlopen(url) - elif path.endswith('/') and os.path.isdir(filename): - files = [] - for f in os.listdir(filename): - if f=='index.html': - fp = open(os.path.join(filename,f),'rb') - body = fp.read() - fp.close() - break - elif os.path.isdir(os.path.join(filename,f)): - f+='/' - files.append("<a href=%r>%s</a>" % (f,f)) - else: - body = ("<html><head><title>%s" % url) + \ - "%s" % '\n'.join(files) - status, message = 200, "OK" - else: - status, message, body = 404, "Path not found", "Not found" - - return HTTPError(url, status, message, - {'content-type':'text/html'}, StringIO(body)) diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/package_index.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/package_index.pyc deleted file mode 100644 index 60197acbdfcfa6307422f2ebe52ebbadcb401510..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38296 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 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/sandbox.py b/PythonEnv/2.7/Lib/site-packages/setuptools/sandbox.py deleted file mode 100644 index 29fc07b8d..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/sandbox.py +++ /dev/null @@ -1,324 +0,0 @@ -import os, sys, tempfile, operator, pkg_resources -if os.name == "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 - -from setuptools.compat import builtins, execfile, reduce - -__all__ = [ - "AbstractSandbox", "DirectorySandbox", "SandboxViolation", "run_setup", -] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -def run_setup(setup_script, args): - """Run a distutils setup script, sandboxed in its directory""" - old_dir = os.getcwd() - save_argv = sys.argv[:] - save_path = sys.path[:] - setup_dir = os.path.abspath(os.path.dirname(setup_script)) - temp_dir = os.path.join(setup_dir,'temp') - if not os.path.isdir(temp_dir): os.makedirs(temp_dir) - save_tmp = tempfile.tempdir - save_modules = sys.modules.copy() - pr_state = pkg_resources.__getstate__() - try: - tempfile.tempdir = temp_dir - os.chdir(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()) - DirectorySandbox(setup_dir).run( - lambda: execfile( - "setup.py", - {'__file__':setup_script, '__name__':'__main__'} - ) - ) - except SystemExit: - v = sys.exc_info()[1] - if v.args and v.args[0]: - raise - # Normal exit, just return - finally: - pkg_resources.__setstate__(pr_state) - sys.modules.update(save_modules) - # remove any modules imported within the sandbox - del_modules = [ - mod_name for mod_name in sys.modules - if mod_name not in save_modules - # exclude any encodings modules. See #285 - and not mod_name.startswith('encodings.') - ] - list(map(sys.modules.__delitem__, del_modules)) - os.chdir(old_dir) - sys.path[:] = save_path - sys.argv[:] = save_argv - tempfile.tempdir = save_tmp - - - -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 run(self, func): - """Run 'func' under os sandboxing""" - try: - self._copy(self) - if _file: - builtins.file = self._file - builtins.open = self._open - self._active = True - return func() - finally: - self._active = False - if _file: - builtins.file = _file - builtins.open = _open - self._copy(_os) - - 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 = [] - -try: - from win32com.client.gencache import GetGeneratePath - _EXCEPTIONS.append(GetGeneratePath()) - del GetGeneratePath -except ImportError: - # it appears pywin32 is not installed, so no need to exclude. - pass - -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", - ]) - - 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): - 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)) - if (self._exempted(realpath) or realpath == self._sandbox - or realpath.startswith(self._prefix)): - return True - finally: - self._active = active - - def _exempted(self, filepath): - exception_matches = map(filepath.startswith, self._exceptions) - return True in exception_matches - - 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=0x1FF, *args, **kw): # 0777 - """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 = 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""" - - def __str__(self): - return """SandboxViolation: %s%r %s - -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.""" % self.args - - - - - - - - - - - - - - - - - - - - - - - - - - - -# diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/sandbox.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/sandbox.pyc deleted file mode 100644 index dc7e2f82b5a794215b57653abb16804ded802052..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13316 zcmd5@O>i8?b$+wE0I~QXK!E?G$dOEnD~mv4N2S;RpBE;)zzkV`7(RBo=yA%|2Ymt1qpF_)xDx#Z%i9CC5K@Adu>q$)`z z0!3kZyL)=NU%&qP{dKGS%Zbs|*?;*#T{{0p@cSN~{2v{W5Py!uA}hVTBP&j~z9cK9 zZoVultZg5858rmgj4dQEI%yC zgP%JfZl%UKnHlZuP_MH$xR6V=8LVvdEBsq5D#&gGTR{!$EX6@2^HE;3izv<)vMj|U zSwDv4VVZ45NyE=gQ7f~O7+GycaSn^R=tGM1Rf4d3iAI1aRumi$dSh- zDN3?YmNSpbnyVmJ(f1W%kPVR;mQQsNunv!Vl?P-OAVoJNc|6>0IU>8mT&}#WHPueh zNigWBY>dg{13J#QY)mKtBV^#lq~@#g=hCm20#H*Nl3k4H$T3TJ zjXxj}pet$Pk~qbTY#e5fnmZyJM{gX-c7VCQBD*761{`hG z{Qa6d9+O@CjmYK!$(}mMZ=B)I!tBOvnb>^lJRaw?i?dzMxw5OfiHzY2flDRreHTlo z?5OS9U7aTiBVAviP;9c=}Lu{GRCq@adh(Imgms_)!u zM8$f0_1%{@Q z30Cu79`NDpt>{dnq#*mE9M#IGX0U0Hw<3|?Qjy3`SYRvWn`zjNjUBF@Vkt>|YqQ~J zCQsX09k0ko-v@bl0hEFB9H+j{9yr4oVABae{F9Zzx_s1Wpsw4#4`3zo%ip{nXZGuO@_8gu8h1wV-x=qK zGc8k2)tPk0f#Iq%f%KR&QyO(vVDnq0%8_2yita^@usX)#lR+m zxdD9u`{$|{m>8-XV5mL8NL9J?;HuznIfM~3B2Qr%9TYQ3yA1{$Of2N_>B^))iLwU$ z!Eiy%lx)YewP0I?6Rd{`1Y-wgO$Y-I8gWL#!xA2m5DM^^gvTX>sRkqMl!T|HG4nzS zKj#?FQTVw$_#70zqBA`t+uxQDs_LvXN-ykW)-i{k?_}0_FzYObu68o5oxCdHYhTn! z=9uZ{JIR~}89Mozc7h3>(+sA0UNe~N>zX+#-cpSKRj4dyLCd|6<`-NGbr<>oW$f(Q z8yDP;Mdq%hnY)F()ehq55hUL;N-G*Fn|B78lN!e zV79>u1&hEqm@)V(i}PR%|2o1^c;B9tUgT$&VwEQW+{?SXD^X87ozhABQUG?Rw6bPfo1cE&nMNtt3Bj=tz9x z$eM2YkKtCS4Cw6YIzJ+Vh{>~f^7oK%O<_ySYQ~{~Y4H!k9aj8jWw{5p3hq{k0Qgk< z!|v$3rTt0myl6T20kYO~$PBCqzZFE8N)gLjB|58Hk&+kIlpqo}AKLG^LsZYFS=5M< zAl6m*@}-7?BoQPGo`p0yiC$)=TBJ5A<$f{~EdrJ-qu6>d%ccc@ZH*+mr> zkX;a2imJDe>7eS|3sCi$;%N_#WsdZE9+EwauurH_ z5PXK=dx$yp9Ad~<75s{hmkFC=poFl=AxYsE4g%+={W-vXt$5!f(ced+`+_#O;)Xs8 zECKH|zTs-u*I~nSa_K|sN;NlWEN}~9;nFP|PHHC#K7Nxm`JOq1so;mPWn5q9=gijE zvotOAeXIkk2SNWt#XFlcH`gL~H|(OhnSg*1dD8A1l^S_ao zU1W1qMfQitbdded7b2St)KMQ4mcTaz^wOTHF60#@6rSE)l1OI@t|TRB+AhAL!2b&n zsZj@t%Hz)I=b%sSS?Iq+VM#eLfO`74;B3*(l0PT?Tv>spogPvYWhMxFVv?RJgy;WV z?NY3DWvs&JA}V@FfB-?rvxBPI0IJH07%18rM!Yiy$je$c4_i= zSdCZ>qLfAI>dtlP!NGfDkOe;8j!Ox3(S5jXigg&as?XS_v%%59fEB9hO_yw+)=ke2 z{4Tw!9R8Zq{aP_w{NJW)cqSggY%_K=6rRzzhJ)9se9*Z7j$sKD%~%msR!jF`@XgwrN!Uk>CTR_ zh*;;NtNAuEoz+CF2`3sf@GCr>fUVYlQNjy#3hWCw8B6Nu=HJEld)YwKKX>D3(_lZ) z2EB+vvUySC9l5nY-QMEoIo0{>T9!6*vTL?TEn>JbH4W7YHXZnOA46LL~r z4HZ6dT8E3OM%ZGS7!N17;$35Mok^3)118*8YC7mzD}jBE?2`!bxJm(@oF4VCGh7-j zRfnsU>Qr^)s52=i%i|-%&NP&58Bx+B&WRH0O4aHN-}Qeh_@bh03(Z#2j$_4voJq=|x2m-$X!@k;-n=vVmhjL_CMY zAZ&^gT;vf^ozxJXMoKe;I5nWjS5#Kch+s?rX8lU)@D|N-J|>I z{g8>zV z0a3$Fy$$Rrw_)h=l^&@>lFZ*fM+@f#9l^rUju?czqTk?%Q12Dsd%WUZfR2}muOSFD z{=;CK3Q;xLk~C}90|eqmP!0Pnrqa=Z-#KdYPT-B*h^@@5McXz)fnyTW;yHD$$o04< z`!f*-ynSXk)9oN z4M+zKJo2eOPpgt%iX63~a;tk?;9o(P)liOxpR=CTK^dwO{4HbvC>(0=ocddR)dZ}J zcgmPB0+SlS?M1Nk&>x^2tflfID;B+{ND-O@dJ6lqYJYAk8MoCNwnhtEDv3BP(+^hd z&u#Bhys`Hx%ECT^la`jb9na67A6tD#M9Y}>iQ6~J*}{Vf}H_k!jF7L`6=#o6X61nJs@BPDnZ3N zX4&y@u`^ZX=XDJrgALfqC9y@^A7i(AFpxE9N#RUEH@xls4hmgKHU=83DWyhLPbGM0 zD&AuxdMxeZQWH*>P3Zj|>*tvKJ`+lk0U@Z8Q|%Yt3NhNjzA~Md{trAkZAb=Gcy@dS z|4ln1C0&9t>iH;$&LU$aJ#;gfrpHyhLk0DW+j_iTL)0zWIsO{5cJe=FPAAX4Y*c;( zIR@8MaT1MSb1m`^t(x1_cg?x7IZb#h!TL0;wMO9x@c>x{WZ|Y+my!-c=RY zvPyh#gtxMQMRim=I-w-g38=Ds$_aqI9*nx^xjG*TriU5sLf~vEACN$O;1P2JvWWJ| z%l2r8$VDIh$Xm6V-^;$;=c2;Xmi3Ho&?cc-vqwB{iq}_L=piGqkZhq5QGFG}qBG2ATa;!d$+8!lO&AzBB~k zsq*-6wTy$|q4A+=xjF_{j&}R|?}Fn^cDu{+_Zd_DqK)`A!SOHnPL0lMIRz&=`^PR>?T}Fk}Z*{TfaVK_-^Kfw)P_M`8 z9nevGcax*6gK=}Ndown0lF>hh-PQqc(1@W*V5=GviU-8ZGb`#PYDTYY{Fh zVI?_efYLT2*t}XEWGOCexR^U`qepSD8k;$5zrKkjeL0qFC-#PjitnEVgseeZwI&hm ztiJT{eoiX!3?%#D*Hc-XCS|Ib5izqQd>z$#rN}$X+-W2#)oiph%{-UY+^oepBx%;* zonKr)p0i=ce6E$|(e~U;rXOk~Qp1V1k#~k4QYUCDm5u`~HTq~zfUmJ(70DvPxBCAR zc-tu1K+|=;Bo})Zx91H1mxJ8nj<)w%DW?^Wdi8m(o;G1)>V+M>b?m8PqNwwIY%fGe zIhc*ce3vrHMROD_A? z+a_sdFW}}aTxeClKJe!G*`F}sI_&%E>ylowEA}pVrkCL_AwGJlGzI&ARPTijPPw0!VeP}^n1QAitHz{6_N?lm?GTo+oNldcEKKEDs13y3~ zOGN{7a^{?2PU3zI`pNY3F@?kF(0xs%1wjU|BxH~|P%@|-SUSMavBsVOdn4w;(uLg+ z&;xW^by1&!haD*Tpf^!{ZNvOHOsf^Pi&QXUNO(TsECDBxIX~qUCS;hv( i0eycmle_lamzBtx60aP})*}L+jiAq5=2H#Xfc*fMwRB4W diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/script template.py b/PythonEnv/2.7/Lib/site-packages/setuptools/script template.py deleted file mode 100644 index 8dd5d5100..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/script template.py +++ /dev/null @@ -1,4 +0,0 @@ -# EASY-INSTALL-SCRIPT: %(spec)r,%(script_name)r -__requires__ = """%(spec)r""" -import pkg_resources -pkg_resources.run_script("""%(spec)r""", """%(script_name)r""") diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/script template.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/script template.pyc deleted file mode 100644 index a7c08b95038cd28fb8e668935688ab621bb46a4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 314 zcmYk1!Ab)$5QZnaB2rp>1ux3>&>ngzh=_vTM3f$c5(vASaT~jvjhTtiv#;tK_y9Uv z1s%wrf4<2~nEZ1xs%9ULHT*^{_mvzv6R`kmQ3W=GR>4{UDtO5TZgY6gKuKX$91QP| zL{19|SWlz-lDMbiA5=#d*!Z%;X)K2MJQgt~;%jmd$rzpp2-`*w^(od!JQ5OQ<#_=Xq`pNn0_Bo>c=PKv*4OXeq4?EuU{?@= 3.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") - - #print "loaded", __file__ - - 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/PythonEnv/2.7/Lib/site-packages/setuptools/site-patch.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/site-patch.pyc deleted file mode 100644 index 40d668d4ca922c3c3c091653f28623fcca1e6627..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1839 zcmcgs&2A$_5Uy@J{)?SB&Sps>B%)|Vd`S-B5D6i~YO_+1*buxcIe<6A*weAc9?y(t zI-3M}4iJucf<5yBDRjn(MVIWO@`=(NPSHdB0|&iW)7hOum+=y^#m*Z6;Mb5MnII^ z+ln#)<8#gSRM9X;!#rc%z^iGhIcrp+^pvJV!vc9ZDekhXnz+;lqNcFH`(aTaO7mn} z<{U3iK6vIR%Lzn<>>>xFzxu%{GGA_P4Qjeis>7+tI01k zdBg2ag(!}gDC!o4Xql2t1$($e-h#MFG%ek^UMtwc<+)3pOkOL1UGLqAQ>P4+%kykt z_Z8h}>VSKNvPH_O)D9m|-mcK7LdluJhuJ7PomS>TB@;O!`gT*Gq#C?aG+m{eJgGJm z#lf&4!#h0zLK}#lwDP?oyUL=n+7+nqE~{W4aP#QYE7Atmxu!Eslb;ngU!%Fu=(8+B zqj{0uS);3U*81=zS_90(IgFb8rP`>FAFk1Ki4HU(xdtX*rVW60a37W_t8-J?iVV3y zSGV`9zWWa=j$Wk<0QlDBe%$IQT9T`i+-jaU+6CDanH|DvG%8T~<6B`rX~YcQxu^I{ z_TaxFN17Bv7U=*WlV`e(=$S}O)Op^l;HDq@f8%4>Jo)m)(dWk}k6#?w1#B<<@PmCQ zOBB0y;P~S>N~}qop4%H3o5y+TTa!M5@g%wkyl}^Eo%^A;Wd~*}F>bK6!vQ;68j#68c*B+M^+k~(DBnl<0Z>-cmjzVKg z2#f>Qo=3@8c&BmTTgl<%)Wl*V$F(+*JOSl;feFRw`AO)GXIPGN?gz$kgev#r%=pVb zh}`=<13(lx|5U_znk0~jwd(~@I@8GWdsaA(-I3wKEmltSc0G>;LUCKbnH$F@^u(Nr z)8v1o7Q?mJ-@=;76a$m>Nv$WXaLD+YaTptrW2tyIF@a>}CTTIG>{E*oja$pS=X}qk zy+nE$h0$f`h;|Yg1zwDS@c2BL4oLF<PRe1!Vxs)7>SzSNu9GdP$zjJbJ2T}MmeAU_CJLr7ocRQ@pZtV6(Zr`LGNP7|6 zC<KyEC1q<(j z%IQtLs1|fJzmJSEB9`>Beh5!N*HuHWW4EsAxjN2UduTJ@>ist?S1@(;A diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/ssl_support.py b/PythonEnv/2.7/Lib/site-packages/setuptools/ssl_support.py deleted file mode 100644 index f8a780a95..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/ssl_support.py +++ /dev/null @@ -1,255 +0,0 @@ -import sys, os, socket, atexit, re -import pkg_resources -from pkg_resources import ResolutionError, ExtractionError -from setuptools.compat import urllib2 - -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 -""".strip().split() - - -HTTPSHandler = HTTPSConnection = object - -for what, where in ( - ('HTTPSHandler', ['urllib2','urllib.request']), - ('HTTPSConnection', ['httplib', 'http.client']), -): - for module in where: - try: - exec("from %s import %s" % (module, what)) - except ImportError: - pass - -is_available = ssl is not None and object not in (HTTPSHandler, HTTPSConnection) - - - - - -try: - from socket import create_connection -except ImportError: - _GLOBAL_DEFAULT_TIMEOUT = getattr(socket, '_GLOBAL_DEFAULT_TIMEOUT', object()) - def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT, - source_address=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 - err = None - for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): - af, socktype, proto, canonname, sa = res - sock = None - try: - sock = socket.socket(af, socktype, proto) - if timeout is not _GLOBAL_DEFAULT_TIMEOUT: - sock.settimeout(timeout) - if source_address: - sock.bind(source_address) - sock.connect(sa) - return sock - - except error: - err = True - if sock is not None: - sock.close() - if err: - raise - else: - raise error("getaddrinfo returns an empty list") - - -try: - from ssl import CertificateError, match_hostname -except ImportError: - class CertificateError(ValueError): - pass - - def _dnsname_to_pat(dn, max_wildcards=1): - pats = [] - for frag in dn.split(r'.'): - if frag.count('*') > max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survery of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise CertificateError( - "too many wildcards in certificate DNS name: " + repr(dn)) - if frag == '*': - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append('[^.]+') - else: - # Otherwise, '*' matches any dotless fragment. - frag = re.escape(frag) - pats.append(frag.replace(r'\*', '[^.]*')) - return re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - - def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 rules - are mostly 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_to_pat(value).match(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_to_pat(value).match(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 = create_connection( - (self.host, self.port), getattr(self,'source_address',None) - ) - self.sock = ssl.wrap_socket( - sock, cert_reqs=ssl.CERT_REQUIRED, ca_certs=self.ca_bundle - ) - try: - match_hostname(self.sock.getpeercert(), self.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 urllib2.build_opener( - VerifyingHTTPSHandler(ca_bundle or find_ca_bundle()) - ).open - - - -_wincerts = None - -def get_win_certfile(): - global _wincerts - if _wincerts is not None: - return _wincerts.name - - try: - from wincertstore import CertFile - except ImportError: - return None - - class MyCertFile(CertFile): - def __init__(self, stores=(), certs=()): - CertFile.__init__(self) - for store in stores: - self.addstore(store) - self.addcerts(certs) - atexit.register(self.close) - - _wincerts = MyCertFile(stores=['CA', 'ROOT']) - return _wincerts.name - - -def find_ca_bundle(): - """Return an existing CA bundle path, or None""" - if os.name=='nt': - return get_win_certfile() - else: - for cert_path in cert_paths: - if os.path.isfile(cert_path): - return cert_path - try: - return pkg_resources.resource_filename('certifi', 'cacert.pem') - except (ImportError, ResolutionError, ExtractionError): - return None - - - - - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/ssl_support.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/ssl_support.pyc deleted file mode 100644 index 0e049d5332aef92b162e4458059fd3017e37c412..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9114 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 A!vFvP diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/doctest.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/doctest.py deleted file mode 100644 index 35d588d07..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/doctest.py +++ /dev/null @@ -1,2683 +0,0 @@ -# Module doctest. -# Released to the public domain 16-Jan-2001, by Tim Peters (tim@python.org). -# Major enhancements and refactoring by: -# Jim Fulton -# Edward Loper - -# Provided as-is; use at your own risk; no warranty; no promises; enjoy! - -try: - basestring -except NameError: - basestring = str - -try: - enumerate -except NameError: - def enumerate(seq): - return zip(range(len(seq)),seq) - -r"""Module doctest -- a framework for running examples in docstrings. - -In simplest use, end each module M to be tested with: - -def _test(): - import doctest - doctest.testmod() - -if __name__ == "__main__": - _test() - -Then running the module as a script will cause the examples in the -docstrings to get executed and verified: - -python M.py - -This won't display anything unless an example fails, in which case the -failing example(s) and the cause(s) of the failure(s) are printed to stdout -(why not stderr? because stderr is a lame hack <0.2 wink>), and the final -line of output is "Test failed.". - -Run it with the -v switch instead: - -python M.py -v - -and a detailed report of all examples tried is printed to stdout, along -with assorted summaries at the end. - -You can force verbose mode by passing "verbose=True" to testmod, or prohibit -it by passing "verbose=False". In either of those cases, sys.argv is not -examined by testmod. - -There are a variety of other ways to run doctests, including integration -with the unittest framework, and support for running non-Python text -files containing doctests. There are also many ways to override parts -of doctest's default behaviors. See the Library Reference Manual for -details. -""" - -__docformat__ = 'reStructuredText en' - -__all__ = [ - # 0, Option Flags - 'register_optionflag', - 'DONT_ACCEPT_TRUE_FOR_1', - 'DONT_ACCEPT_BLANKLINE', - 'NORMALIZE_WHITESPACE', - 'ELLIPSIS', - 'IGNORE_EXCEPTION_DETAIL', - 'COMPARISON_FLAGS', - 'REPORT_UDIFF', - 'REPORT_CDIFF', - 'REPORT_NDIFF', - 'REPORT_ONLY_FIRST_FAILURE', - 'REPORTING_FLAGS', - # 1. Utility Functions - 'is_private', - # 2. Example & DocTest - 'Example', - 'DocTest', - # 3. Doctest Parser - 'DocTestParser', - # 4. Doctest Finder - 'DocTestFinder', - # 5. Doctest Runner - 'DocTestRunner', - 'OutputChecker', - 'DocTestFailure', - 'UnexpectedException', - 'DebugRunner', - # 6. Test Functions - 'testmod', - 'testfile', - 'run_docstring_examples', - # 7. Tester - 'Tester', - # 8. Unittest Support - 'DocTestSuite', - 'DocFileSuite', - 'set_unittest_reportflags', - # 9. Debugging Support - 'script_from_examples', - 'testsource', - 'debug_src', - 'debug', -] - -import __future__ - -import sys, traceback, inspect, linecache, os, re, types -import unittest, difflib, pdb, tempfile -import warnings -from setuptools.compat import StringIO, execfile, exec_, func_code, im_func - -# Don't whine about the deprecated is_private function in this -# module's tests. -warnings.filterwarnings("ignore", "is_private", DeprecationWarning, - __name__, 0) - -# There are 4 basic classes: -# - Example: a pair, plus an intra-docstring line number. -# - DocTest: a collection of examples, parsed from a docstring, plus -# info about where the docstring came from (name, filename, lineno). -# - DocTestFinder: extracts DocTests from a given object's docstring and -# its contained objects' docstrings. -# - DocTestRunner: runs DocTest cases, and accumulates statistics. -# -# So the basic picture is: -# -# list of: -# +------+ +---------+ +-------+ -# |object| --DocTestFinder-> | DocTest | --DocTestRunner-> |results| -# +------+ +---------+ +-------+ -# | Example | -# | ... | -# | Example | -# +---------+ - -# Option constants. - -OPTIONFLAGS_BY_NAME = {} -def register_optionflag(name): - flag = 1 << len(OPTIONFLAGS_BY_NAME) - OPTIONFLAGS_BY_NAME[name] = flag - return flag - -DONT_ACCEPT_TRUE_FOR_1 = register_optionflag('DONT_ACCEPT_TRUE_FOR_1') -DONT_ACCEPT_BLANKLINE = register_optionflag('DONT_ACCEPT_BLANKLINE') -NORMALIZE_WHITESPACE = register_optionflag('NORMALIZE_WHITESPACE') -ELLIPSIS = register_optionflag('ELLIPSIS') -IGNORE_EXCEPTION_DETAIL = register_optionflag('IGNORE_EXCEPTION_DETAIL') - -COMPARISON_FLAGS = (DONT_ACCEPT_TRUE_FOR_1 | - DONT_ACCEPT_BLANKLINE | - NORMALIZE_WHITESPACE | - ELLIPSIS | - IGNORE_EXCEPTION_DETAIL) - -REPORT_UDIFF = register_optionflag('REPORT_UDIFF') -REPORT_CDIFF = register_optionflag('REPORT_CDIFF') -REPORT_NDIFF = register_optionflag('REPORT_NDIFF') -REPORT_ONLY_FIRST_FAILURE = register_optionflag('REPORT_ONLY_FIRST_FAILURE') - -REPORTING_FLAGS = (REPORT_UDIFF | - REPORT_CDIFF | - REPORT_NDIFF | - REPORT_ONLY_FIRST_FAILURE) - -# Special string markers for use in `want` strings: -BLANKLINE_MARKER = '' -ELLIPSIS_MARKER = '...' - -###################################################################### -## Table of Contents -###################################################################### -# 1. Utility Functions -# 2. Example & DocTest -- store test cases -# 3. DocTest Parser -- extracts examples from strings -# 4. DocTest Finder -- extracts test cases from objects -# 5. DocTest Runner -- runs test cases -# 6. Test Functions -- convenient wrappers for testing -# 7. Tester Class -- for backwards compatibility -# 8. Unittest Support -# 9. Debugging Support -# 10. Example Usage - -###################################################################### -## 1. Utility Functions -###################################################################### - -def is_private(prefix, base): - """prefix, base -> true iff name prefix + "." + base is "private". - - Prefix may be an empty string, and base does not contain a period. - Prefix is ignored (although functions you write conforming to this - protocol may make use of it). - Return true iff base begins with an (at least one) underscore, but - does not both begin and end with (at least) two underscores. - - >>> is_private("a.b", "my_func") - False - >>> is_private("____", "_my_func") - True - >>> is_private("someclass", "__init__") - False - >>> is_private("sometypo", "__init_") - True - >>> is_private("x.y.z", "_") - True - >>> is_private("_x.y.z", "__") - False - >>> is_private("", "") # senseless but consistent - False - """ - warnings.warn("is_private is deprecated; it wasn't useful; " - "examine DocTestFinder.find() lists instead", - DeprecationWarning, stacklevel=2) - return base[:1] == "_" and not base[:2] == "__" == base[-2:] - -def _extract_future_flags(globs): - """ - Return the compiler-flags associated with the future features that - have been imported into the given namespace (globs). - """ - flags = 0 - for fname in __future__.all_feature_names: - feature = globs.get(fname, None) - if feature is getattr(__future__, fname): - flags |= feature.compiler_flag - return flags - -def _normalize_module(module, depth=2): - """ - Return the module specified by `module`. In particular: - - If `module` is a module, then return module. - - If `module` is a string, then import and return the - module with that name. - - If `module` is None, then return the calling module. - The calling module is assumed to be the module of - the stack frame at the given depth in the call stack. - """ - if inspect.ismodule(module): - return module - elif isinstance(module, basestring): - return __import__(module, globals(), locals(), ["*"]) - elif module is None: - return sys.modules[sys._getframe(depth).f_globals['__name__']] - else: - raise TypeError("Expected a module, string, or None") - -def _indent(s, indent=4): - """ - Add the given number of space characters to the beginning every - non-blank line in `s`, and return the result. - """ - # This regexp matches the start of non-blank lines: - return re.sub('(?m)^(?!$)', indent*' ', s) - -def _exception_traceback(exc_info): - """ - Return a string containing a traceback message for the given - exc_info tuple (as returned by sys.exc_info()). - """ - # Get a traceback message. - excout = StringIO() - exc_type, exc_val, exc_tb = exc_info - traceback.print_exception(exc_type, exc_val, exc_tb, file=excout) - return excout.getvalue() - -# Override some StringIO methods. -class _SpoofOut(StringIO): - def getvalue(self): - result = StringIO.getvalue(self) - # If anything at all was written, make sure there's a trailing - # newline. There's no way for the expected output to indicate - # that a trailing newline is missing. - if result and not result.endswith("\n"): - result += "\n" - # Prevent softspace from screwing up the next test case, in - # case they used print with a trailing comma in an example. - if hasattr(self, "softspace"): - del self.softspace - return result - - def truncate(self, size=None): - StringIO.truncate(self, size) - if hasattr(self, "softspace"): - del self.softspace - -# Worst-case linear-time ellipsis matching. -def _ellipsis_match(want, got): - """ - Essentially the only subtle case: - >>> _ellipsis_match('aa...aa', 'aaa') - False - """ - if want.find(ELLIPSIS_MARKER)==-1: - return want == got - - # Find "the real" strings. - ws = want.split(ELLIPSIS_MARKER) - assert len(ws) >= 2 - - # Deal with exact matches possibly needed at one or both ends. - startpos, endpos = 0, len(got) - w = ws[0] - if w: # starts with exact match - if got.startswith(w): - startpos = len(w) - del ws[0] - else: - return False - w = ws[-1] - if w: # ends with exact match - if got.endswith(w): - endpos -= len(w) - del ws[-1] - else: - return False - - if startpos > endpos: - # Exact end matches required more characters than we have, as in - # _ellipsis_match('aa...aa', 'aaa') - return False - - # For the rest, we only need to find the leftmost non-overlapping - # match for each piece. If there's no overall match that way alone, - # there's no overall match period. - for w in ws: - # w may be '' at times, if there are consecutive ellipses, or - # due to an ellipsis at the start or end of `want`. That's OK. - # Search for an empty string succeeds, and doesn't change startpos. - startpos = got.find(w, startpos, endpos) - if startpos < 0: - return False - startpos += len(w) - - return True - -def _comment_line(line): - "Return a commented form of the given line" - line = line.rstrip() - if line: - return '# '+line - else: - return '#' - -class _OutputRedirectingPdb(pdb.Pdb): - """ - A specialized version of the python debugger that redirects stdout - to a given stream when interacting with the user. Stdout is *not* - redirected when traced code is executed. - """ - def __init__(self, out): - self.__out = out - pdb.Pdb.__init__(self) - - def trace_dispatch(self, *args): - # Redirect stdout to the given stream. - save_stdout = sys.stdout - sys.stdout = self.__out - # Call Pdb's trace dispatch method. - try: - return pdb.Pdb.trace_dispatch(self, *args) - finally: - sys.stdout = save_stdout - -# [XX] Normalize with respect to os.path.pardir? -def _module_relative_path(module, path): - if not inspect.ismodule(module): - raise TypeError('Expected a module: %r' % module) - if path.startswith('/'): - raise ValueError('Module-relative files may not have absolute paths') - - # Find the base directory for the path. - if hasattr(module, '__file__'): - # A normal module/package - basedir = os.path.split(module.__file__)[0] - elif module.__name__ == '__main__': - # An interactive session. - if len(sys.argv)>0 and sys.argv[0] != '': - basedir = os.path.split(sys.argv[0])[0] - else: - basedir = os.curdir - else: - # A module w/o __file__ (this includes builtins) - raise ValueError("Can't resolve paths relative to the module " + - module + " (it has no __file__)") - - # Combine the base directory and the path. - return os.path.join(basedir, *(path.split('/'))) - -###################################################################### -## 2. Example & DocTest -###################################################################### -## - An "example" is a pair, where "source" is a -## fragment of source code, and "want" is the expected output for -## "source." The Example class also includes information about -## where the example was extracted from. -## -## - A "doctest" is a collection of examples, typically extracted from -## a string (such as an object's docstring). The DocTest class also -## includes information about where the string was extracted from. - -class Example: - """ - A single doctest example, consisting of source code and expected - output. `Example` defines the following attributes: - - - source: A single Python statement, always ending with a newline. - The constructor adds a newline if needed. - - - want: The expected output from running the source code (either - from stdout, or a traceback in case of exception). `want` ends - with a newline unless it's empty, in which case it's an empty - string. The constructor adds a newline if needed. - - - exc_msg: The exception message generated by the example, if - the example is expected to generate an exception; or `None` if - it is not expected to generate an exception. This exception - message is compared against the return value of - `traceback.format_exception_only()`. `exc_msg` ends with a - newline unless it's `None`. The constructor adds a newline - if needed. - - - lineno: The line number within the DocTest string containing - this Example where the Example begins. This line number is - zero-based, with respect to the beginning of the DocTest. - - - indent: The example's indentation in the DocTest string. - I.e., the number of space characters that preceed the - example's first prompt. - - - options: A dictionary mapping from option flags to True or - False, which is used to override default options for this - example. Any option flags not contained in this dictionary - are left at their default value (as specified by the - DocTestRunner's optionflags). By default, no options are set. - """ - def __init__(self, source, want, exc_msg=None, lineno=0, indent=0, - options=None): - # Normalize inputs. - if not source.endswith('\n'): - source += '\n' - if want and not want.endswith('\n'): - want += '\n' - if exc_msg is not None and not exc_msg.endswith('\n'): - exc_msg += '\n' - # Store properties. - self.source = source - self.want = want - self.lineno = lineno - self.indent = indent - if options is None: options = {} - self.options = options - self.exc_msg = exc_msg - -class DocTest: - """ - A collection of doctest examples that should be run in a single - namespace. Each `DocTest` defines the following attributes: - - - examples: the list of examples. - - - globs: The namespace (aka globals) that the examples should - be run in. - - - name: A name identifying the DocTest (typically, the name of - the object whose docstring this DocTest was extracted from). - - - filename: The name of the file that this DocTest was extracted - from, or `None` if the filename is unknown. - - - lineno: The line number within filename where this DocTest - begins, or `None` if the line number is unavailable. This - line number is zero-based, with respect to the beginning of - the file. - - - docstring: The string that the examples were extracted from, - or `None` if the string is unavailable. - """ - def __init__(self, examples, globs, name, filename, lineno, docstring): - """ - Create a new DocTest containing the given examples. The - DocTest's globals are initialized with a copy of `globs`. - """ - assert not isinstance(examples, basestring), \ - "DocTest no longer accepts str; use DocTestParser instead" - self.examples = examples - self.docstring = docstring - self.globs = globs.copy() - self.name = name - self.filename = filename - self.lineno = lineno - - def __repr__(self): - if len(self.examples) == 0: - examples = 'no examples' - elif len(self.examples) == 1: - examples = '1 example' - else: - examples = '%d examples' % len(self.examples) - return ('' % - (self.name, self.filename, self.lineno, examples)) - - - # This lets us sort tests by name: - def __cmp__(self, other): - if not isinstance(other, DocTest): - return -1 - return cmp((self.name, self.filename, self.lineno, id(self)), - (other.name, other.filename, other.lineno, id(other))) - -###################################################################### -## 3. DocTestParser -###################################################################### - -class DocTestParser: - """ - A class used to parse strings containing doctest examples. - """ - # This regular expression is used to find doctest examples in a - # string. It defines three groups: `source` is the source code - # (including leading indentation and prompts); `indent` is the - # indentation of the first (PS1) line of the source code; and - # `want` is the expected output (including leading indentation). - _EXAMPLE_RE = re.compile(r''' - # Source consists of a PS1 line followed by zero or more PS2 lines. - (?P - (?:^(?P [ ]*) >>> .*) # PS1 line - (?:\n [ ]* \.\.\. .*)*) # PS2 lines - \n? - # Want consists of any non-blank lines that do not start with PS1. - (?P (?:(?![ ]*$) # Not a blank line - (?![ ]*>>>) # Not a line starting with PS1 - .*$\n? # But any other line - )*) - ''', re.MULTILINE | re.VERBOSE) - - # A regular expression for handling `want` strings that contain - # expected exceptions. It divides `want` into three pieces: - # - the traceback header line (`hdr`) - # - the traceback stack (`stack`) - # - the exception message (`msg`), as generated by - # traceback.format_exception_only() - # `msg` may have multiple lines. We assume/require that the - # exception message is the first non-indented line starting with a word - # character following the traceback header line. - _EXCEPTION_RE = re.compile(r""" - # Grab the traceback header. Different versions of Python have - # said different things on the first traceback line. - ^(?P Traceback\ \( - (?: most\ recent\ call\ last - | innermost\ last - ) \) : - ) - \s* $ # toss trailing whitespace on the header. - (?P .*?) # don't blink: absorb stuff until... - ^ (?P \w+ .*) # a line *starts* with alphanum. - """, re.VERBOSE | re.MULTILINE | re.DOTALL) - - # A callable returning a true value iff its argument is a blank line - # or contains a single comment. - _IS_BLANK_OR_COMMENT = re.compile(r'^[ ]*(#.*)?$').match - - def parse(self, string, name=''): - """ - Divide the given string into examples and intervening text, - and return them as a list of alternating Examples and strings. - Line numbers for the Examples are 0-based. The optional - argument `name` is a name identifying this string, and is only - used for error messages. - """ - string = string.expandtabs() - # If all lines begin with the same indentation, then strip it. - min_indent = self._min_indent(string) - if min_indent > 0: - string = '\n'.join([l[min_indent:] for l in string.split('\n')]) - - output = [] - charno, lineno = 0, 0 - # Find all doctest examples in the string: - for m in self._EXAMPLE_RE.finditer(string): - # Add the pre-example text to `output`. - output.append(string[charno:m.start()]) - # Update lineno (lines before this example) - lineno += string.count('\n', charno, m.start()) - # Extract info from the regexp match. - (source, options, want, exc_msg) = \ - self._parse_example(m, name, lineno) - # Create an Example, and add it to the list. - if not self._IS_BLANK_OR_COMMENT(source): - output.append( Example(source, want, exc_msg, - lineno=lineno, - indent=min_indent+len(m.group('indent')), - options=options) ) - # Update lineno (lines inside this example) - lineno += string.count('\n', m.start(), m.end()) - # Update charno. - charno = m.end() - # Add any remaining post-example text to `output`. - output.append(string[charno:]) - return output - - def get_doctest(self, string, globs, name, filename, lineno): - """ - Extract all doctest examples from the given string, and - collect them into a `DocTest` object. - - `globs`, `name`, `filename`, and `lineno` are attributes for - the new `DocTest` object. See the documentation for `DocTest` - for more information. - """ - return DocTest(self.get_examples(string, name), globs, - name, filename, lineno, string) - - def get_examples(self, string, name=''): - """ - Extract all doctest examples from the given string, and return - them as a list of `Example` objects. Line numbers are - 0-based, because it's most common in doctests that nothing - interesting appears on the same line as opening triple-quote, - and so the first interesting line is called \"line 1\" then. - - The optional argument `name` is a name identifying this - string, and is only used for error messages. - """ - return [x for x in self.parse(string, name) - if isinstance(x, Example)] - - def _parse_example(self, m, name, lineno): - """ - Given a regular expression match from `_EXAMPLE_RE` (`m`), - return a pair `(source, want)`, where `source` is the matched - example's source code (with prompts and indentation stripped); - and `want` is the example's expected output (with indentation - stripped). - - `name` is the string's name, and `lineno` is the line number - where the example starts; both are used for error messages. - """ - # Get the example's indentation level. - indent = len(m.group('indent')) - - # Divide source into lines; check that they're properly - # indented; and then strip their indentation & prompts. - source_lines = m.group('source').split('\n') - self._check_prompt_blank(source_lines, indent, name, lineno) - self._check_prefix(source_lines[1:], ' '*indent + '.', name, lineno) - source = '\n'.join([sl[indent+4:] for sl in source_lines]) - - # Divide want into lines; check that it's properly indented; and - # then strip the indentation. Spaces before the last newline should - # be preserved, so plain rstrip() isn't good enough. - want = m.group('want') - want_lines = want.split('\n') - if len(want_lines) > 1 and re.match(r' *$', want_lines[-1]): - del want_lines[-1] # forget final newline & spaces after it - self._check_prefix(want_lines, ' '*indent, name, - lineno + len(source_lines)) - want = '\n'.join([wl[indent:] for wl in want_lines]) - - # If `want` contains a traceback message, then extract it. - m = self._EXCEPTION_RE.match(want) - if m: - exc_msg = m.group('msg') - else: - exc_msg = None - - # Extract options from the source. - options = self._find_options(source, name, lineno) - - return source, options, want, exc_msg - - # This regular expression looks for option directives in the - # source code of an example. Option directives are comments - # starting with "doctest:". Warning: this may give false - # positives for string-literals that contain the string - # "#doctest:". Eliminating these false positives would require - # actually parsing the string; but we limit them by ignoring any - # line containing "#doctest:" that is *followed* by a quote mark. - _OPTION_DIRECTIVE_RE = re.compile(r'#\s*doctest:\s*([^\n\'"]*)$', - re.MULTILINE) - - def _find_options(self, source, name, lineno): - """ - Return a dictionary containing option overrides extracted from - option directives in the given source string. - - `name` is the string's name, and `lineno` is the line number - where the example starts; both are used for error messages. - """ - options = {} - # (note: with the current regexp, this will match at most once:) - for m in self._OPTION_DIRECTIVE_RE.finditer(source): - option_strings = m.group(1).replace(',', ' ').split() - for option in option_strings: - if (option[0] not in '+-' or - option[1:] not in OPTIONFLAGS_BY_NAME): - raise ValueError('line %r of the doctest for %s ' - 'has an invalid option: %r' % - (lineno+1, name, option)) - flag = OPTIONFLAGS_BY_NAME[option[1:]] - options[flag] = (option[0] == '+') - if options and self._IS_BLANK_OR_COMMENT(source): - raise ValueError('line %r of the doctest for %s has an option ' - 'directive on a line with no example: %r' % - (lineno, name, source)) - return options - - # This regular expression finds the indentation of every non-blank - # line in a string. - _INDENT_RE = re.compile('^([ ]*)(?=\S)', re.MULTILINE) - - def _min_indent(self, s): - "Return the minimum indentation of any non-blank line in `s`" - indents = [len(indent) for indent in self._INDENT_RE.findall(s)] - if len(indents) > 0: - return min(indents) - else: - return 0 - - def _check_prompt_blank(self, lines, indent, name, lineno): - """ - Given the lines of a source string (including prompts and - leading indentation), check to make sure that every prompt is - followed by a space character. If any line is not followed by - a space character, then raise ValueError. - """ - for i, line in enumerate(lines): - if len(line) >= indent+4 and line[indent+3] != ' ': - raise ValueError('line %r of the docstring for %s ' - 'lacks blank after %s: %r' % - (lineno+i+1, name, - line[indent:indent+3], line)) - - def _check_prefix(self, lines, prefix, name, lineno): - """ - Check that every line in the given list starts with the given - prefix; if any line does not, then raise a ValueError. - """ - for i, line in enumerate(lines): - if line and not line.startswith(prefix): - raise ValueError('line %r of the docstring for %s has ' - 'inconsistent leading whitespace: %r' % - (lineno+i+1, name, line)) - - -###################################################################### -## 4. DocTest Finder -###################################################################### - -class DocTestFinder: - """ - A class used to extract the DocTests that are relevant to a given - object, from its docstring and the docstrings of its contained - objects. Doctests can currently be extracted from the following - object types: modules, functions, classes, methods, staticmethods, - classmethods, and properties. - """ - - def __init__(self, verbose=False, parser=DocTestParser(), - recurse=True, _namefilter=None, exclude_empty=True): - """ - Create a new doctest finder. - - The optional argument `parser` specifies a class or - function that should be used to create new DocTest objects (or - objects that implement the same interface as DocTest). The - signature for this factory function should match the signature - of the DocTest constructor. - - If the optional argument `recurse` is false, then `find` will - only examine the given object, and not any contained objects. - - If the optional argument `exclude_empty` is false, then `find` - will include tests for objects with empty docstrings. - """ - self._parser = parser - self._verbose = verbose - self._recurse = recurse - self._exclude_empty = exclude_empty - # _namefilter is undocumented, and exists only for temporary backward- - # compatibility support of testmod's deprecated isprivate mess. - self._namefilter = _namefilter - - def find(self, obj, name=None, module=None, globs=None, - extraglobs=None): - """ - Return a list of the DocTests that are defined by the given - object's docstring, or by any of its contained objects' - docstrings. - - The optional parameter `module` is the module that contains - the given object. If the module is not specified or is None, then - the test finder will attempt to automatically determine the - correct module. The object's module is used: - - - As a default namespace, if `globs` is not specified. - - To prevent the DocTestFinder from extracting DocTests - from objects that are imported from other modules. - - To find the name of the file containing the object. - - To help find the line number of the object within its - file. - - Contained objects whose module does not match `module` are ignored. - - If `module` is False, no attempt to find the module will be made. - This is obscure, of use mostly in tests: if `module` is False, or - is None but cannot be found automatically, then all objects are - considered to belong to the (non-existent) module, so all contained - objects will (recursively) be searched for doctests. - - The globals for each DocTest is formed by combining `globs` - and `extraglobs` (bindings in `extraglobs` override bindings - in `globs`). A new copy of the globals dictionary is created - for each DocTest. If `globs` is not specified, then it - defaults to the module's `__dict__`, if specified, or {} - otherwise. If `extraglobs` is not specified, then it defaults - to {}. - - """ - # If name was not specified, then extract it from the object. - if name is None: - name = getattr(obj, '__name__', None) - if name is None: - raise ValueError("DocTestFinder.find: name must be given " - "when obj.__name__ doesn't exist: %r" % - (type(obj),)) - - # Find the module that contains the given object (if obj is - # a module, then module=obj.). Note: this may fail, in which - # case module will be None. - if module is False: - module = None - elif module is None: - module = inspect.getmodule(obj) - - # Read the module's source code. This is used by - # DocTestFinder._find_lineno to find the line number for a - # given object's docstring. - try: - file = inspect.getsourcefile(obj) or inspect.getfile(obj) - source_lines = linecache.getlines(file) - if not source_lines: - source_lines = None - except TypeError: - source_lines = None - - # Initialize globals, and merge in extraglobs. - if globs is None: - if module is None: - globs = {} - else: - globs = module.__dict__.copy() - else: - globs = globs.copy() - if extraglobs is not None: - globs.update(extraglobs) - - # Recursively expore `obj`, extracting DocTests. - tests = [] - self._find(tests, obj, name, module, source_lines, globs, {}) - return tests - - def _filter(self, obj, prefix, base): - """ - Return true if the given object should not be examined. - """ - return (self._namefilter is not None and - self._namefilter(prefix, base)) - - def _from_module(self, module, object): - """ - Return true if the given object is defined in the given - module. - """ - if module is None: - return True - elif inspect.isfunction(object): - return module.__dict__ is func_globals(object) - elif inspect.isclass(object): - return module.__name__ == object.__module__ - elif inspect.getmodule(object) is not None: - return module is inspect.getmodule(object) - elif hasattr(object, '__module__'): - return module.__name__ == object.__module__ - elif isinstance(object, property): - return True # [XX] no way not be sure. - else: - raise ValueError("object must be a class or function") - - def _find(self, tests, obj, name, module, source_lines, globs, seen): - """ - Find tests for the given object and any contained objects, and - add them to `tests`. - """ - if self._verbose: - print('Finding tests in %s' % name) - - # If we've already processed this object, then ignore it. - if id(obj) in seen: - return - seen[id(obj)] = 1 - - # Find a test for this object, and add it to the list of tests. - test = self._get_test(obj, name, module, globs, source_lines) - if test is not None: - tests.append(test) - - # Look for tests in a module's contained objects. - if inspect.ismodule(obj) and self._recurse: - for valname, val in obj.__dict__.items(): - # Check if this contained object should be ignored. - if self._filter(val, name, valname): - continue - valname = '%s.%s' % (name, valname) - # Recurse to functions & classes. - if ((inspect.isfunction(val) or inspect.isclass(val)) and - self._from_module(module, val)): - self._find(tests, val, valname, module, source_lines, - globs, seen) - - # Look for tests in a module's __test__ dictionary. - if inspect.ismodule(obj) and self._recurse: - for valname, val in getattr(obj, '__test__', {}).items(): - if not isinstance(valname, basestring): - raise ValueError("DocTestFinder.find: __test__ keys " - "must be strings: %r" % - (type(valname),)) - if not (inspect.isfunction(val) or inspect.isclass(val) or - inspect.ismethod(val) or inspect.ismodule(val) or - isinstance(val, basestring)): - raise ValueError("DocTestFinder.find: __test__ values " - "must be strings, functions, methods, " - "classes, or modules: %r" % - (type(val),)) - valname = '%s.__test__.%s' % (name, valname) - self._find(tests, val, valname, module, source_lines, - globs, seen) - - # Look for tests in a class's contained objects. - if inspect.isclass(obj) and self._recurse: - for valname, val in obj.__dict__.items(): - # Check if this contained object should be ignored. - if self._filter(val, name, valname): - continue - # Special handling for staticmethod/classmethod. - if isinstance(val, staticmethod): - val = getattr(obj, valname) - if isinstance(val, classmethod): - val = im_func(getattr(obj, valname)) - - # Recurse to methods, properties, and nested classes. - if ((inspect.isfunction(val) or inspect.isclass(val) or - isinstance(val, property)) and - self._from_module(module, val)): - valname = '%s.%s' % (name, valname) - self._find(tests, val, valname, module, source_lines, - globs, seen) - - def _get_test(self, obj, name, module, globs, source_lines): - """ - Return a DocTest for the given object, if it defines a docstring; - otherwise, return None. - """ - # Extract the object's docstring. If it doesn't have one, - # then return None (no test for this object). - if isinstance(obj, basestring): - docstring = obj - else: - try: - if obj.__doc__ is None: - docstring = '' - else: - docstring = obj.__doc__ - if not isinstance(docstring, basestring): - docstring = str(docstring) - except (TypeError, AttributeError): - docstring = '' - - # Find the docstring's location in the file. - lineno = self._find_lineno(obj, source_lines) - - # Don't bother if the docstring is empty. - if self._exclude_empty and not docstring: - return None - - # Return a DocTest for this object. - if module is None: - filename = None - else: - filename = getattr(module, '__file__', module.__name__) - if filename[-4:] in (".pyc", ".pyo"): - filename = filename[:-1] - return self._parser.get_doctest(docstring, globs, name, - filename, lineno) - - def _find_lineno(self, obj, source_lines): - """ - Return a line number of the given object's docstring. Note: - this method assumes that the object has a docstring. - """ - lineno = None - - # Find the line number for modules. - if inspect.ismodule(obj): - lineno = 0 - - # Find the line number for classes. - # Note: this could be fooled if a class is defined multiple - # times in a single file. - if inspect.isclass(obj): - if source_lines is None: - return None - pat = re.compile(r'^\s*class\s*%s\b' % - getattr(obj, '__name__', '-')) - for i, line in enumerate(source_lines): - if pat.match(line): - lineno = i - break - - # Find the line number for functions & methods. - if inspect.ismethod(obj): obj = im_func(obj) - if inspect.isfunction(obj): obj = func_code(obj) - if inspect.istraceback(obj): obj = obj.tb_frame - if inspect.isframe(obj): obj = obj.f_code - if inspect.iscode(obj): - lineno = getattr(obj, 'co_firstlineno', None)-1 - - # Find the line number where the docstring starts. Assume - # that it's the first line that begins with a quote mark. - # Note: this could be fooled by a multiline function - # signature, where a continuation line begins with a quote - # mark. - if lineno is not None: - if source_lines is None: - return lineno+1 - pat = re.compile('(^|.*:)\s*\w*("|\')') - for lineno in range(lineno, len(source_lines)): - if pat.match(source_lines[lineno]): - return lineno - - # We couldn't find the line number. - return None - -###################################################################### -## 5. DocTest Runner -###################################################################### - -class DocTestRunner: - """ - A class used to run DocTest test cases, and accumulate statistics. - The `run` method is used to process a single DocTest case. It - returns a tuple `(f, t)`, where `t` is the number of test cases - tried, and `f` is the number of test cases that failed. - - >>> tests = DocTestFinder().find(_TestClass) - >>> runner = DocTestRunner(verbose=False) - >>> for test in tests: - ... print runner.run(test) - (0, 2) - (0, 1) - (0, 2) - (0, 2) - - The `summarize` method prints a summary of all the test cases that - have been run by the runner, and returns an aggregated `(f, t)` - tuple: - - >>> runner.summarize(verbose=1) - 4 items passed all tests: - 2 tests in _TestClass - 2 tests in _TestClass.__init__ - 2 tests in _TestClass.get - 1 tests in _TestClass.square - 7 tests in 4 items. - 7 passed and 0 failed. - Test passed. - (0, 7) - - The aggregated number of tried examples and failed examples is - also available via the `tries` and `failures` attributes: - - >>> runner.tries - 7 - >>> runner.failures - 0 - - The comparison between expected outputs and actual outputs is done - by an `OutputChecker`. This comparison may be customized with a - number of option flags; see the documentation for `testmod` for - more information. If the option flags are insufficient, then the - comparison may also be customized by passing a subclass of - `OutputChecker` to the constructor. - - The test runner's display output can be controlled in two ways. - First, an output function (`out) can be passed to - `TestRunner.run`; this function will be called with strings that - should be displayed. It defaults to `sys.stdout.write`. If - capturing the output is not sufficient, then the display output - can be also customized by subclassing DocTestRunner, and - overriding the methods `report_start`, `report_success`, - `report_unexpected_exception`, and `report_failure`. - """ - # This divider string is used to separate failure messages, and to - # separate sections of the summary. - DIVIDER = "*" * 70 - - def __init__(self, checker=None, verbose=None, optionflags=0): - """ - Create a new test runner. - - Optional keyword arg `checker` is the `OutputChecker` that - should be used to compare the expected outputs and actual - outputs of doctest examples. - - Optional keyword arg 'verbose' prints lots of stuff if true, - only failures if false; by default, it's true iff '-v' is in - sys.argv. - - Optional argument `optionflags` can be used to control how the - test runner compares expected output to actual output, and how - it displays failures. See the documentation for `testmod` for - more information. - """ - self._checker = checker or OutputChecker() - if verbose is None: - verbose = '-v' in sys.argv - self._verbose = verbose - self.optionflags = optionflags - self.original_optionflags = optionflags - - # Keep track of the examples we've run. - self.tries = 0 - self.failures = 0 - self._name2ft = {} - - # Create a fake output target for capturing doctest output. - self._fakeout = _SpoofOut() - - #///////////////////////////////////////////////////////////////// - # Reporting methods - #///////////////////////////////////////////////////////////////// - - def report_start(self, out, test, example): - """ - Report that the test runner is about to process the given - example. (Only displays a message if verbose=True) - """ - if self._verbose: - if example.want: - out('Trying:\n' + _indent(example.source) + - 'Expecting:\n' + _indent(example.want)) - else: - out('Trying:\n' + _indent(example.source) + - 'Expecting nothing\n') - - def report_success(self, out, test, example, got): - """ - Report that the given example ran successfully. (Only - displays a message if verbose=True) - """ - if self._verbose: - out("ok\n") - - def report_failure(self, out, test, example, got): - """ - Report that the given example failed. - """ - out(self._failure_header(test, example) + - self._checker.output_difference(example, got, self.optionflags)) - - def report_unexpected_exception(self, out, test, example, exc_info): - """ - Report that the given example raised an unexpected exception. - """ - out(self._failure_header(test, example) + - 'Exception raised:\n' + _indent(_exception_traceback(exc_info))) - - def _failure_header(self, test, example): - out = [self.DIVIDER] - if test.filename: - if test.lineno is not None and example.lineno is not None: - lineno = test.lineno + example.lineno + 1 - else: - lineno = '?' - out.append('File "%s", line %s, in %s' % - (test.filename, lineno, test.name)) - else: - out.append('Line %s, in %s' % (example.lineno+1, test.name)) - out.append('Failed example:') - source = example.source - out.append(_indent(source)) - return '\n'.join(out) - - #///////////////////////////////////////////////////////////////// - # DocTest Running - #///////////////////////////////////////////////////////////////// - - def __run(self, test, compileflags, out): - """ - Run the examples in `test`. Write the outcome of each example - with one of the `DocTestRunner.report_*` methods, using the - writer function `out`. `compileflags` is the set of compiler - flags that should be used to execute examples. Return a tuple - `(f, t)`, where `t` is the number of examples tried, and `f` - is the number of examples that failed. The examples are run - in the namespace `test.globs`. - """ - # Keep track of the number of failures and tries. - failures = tries = 0 - - # Save the option flags (since option directives can be used - # to modify them). - original_optionflags = self.optionflags - - SUCCESS, FAILURE, BOOM = range(3) # `outcome` state - - check = self._checker.check_output - - # Process each example. - for examplenum, example in enumerate(test.examples): - - # If REPORT_ONLY_FIRST_FAILURE is set, then supress - # reporting after the first failure. - quiet = (self.optionflags & REPORT_ONLY_FIRST_FAILURE and - failures > 0) - - # Merge in the example's options. - self.optionflags = original_optionflags - if example.options: - for (optionflag, val) in example.options.items(): - if val: - self.optionflags |= optionflag - else: - self.optionflags &= ~optionflag - - # Record that we started this example. - tries += 1 - if not quiet: - self.report_start(out, test, example) - - # Use a special filename for compile(), so we can retrieve - # the source code during interactive debugging (see - # __patched_linecache_getlines). - filename = '' % (test.name, examplenum) - - # Run the example in the given context (globs), and record - # any exception that gets raised. (But don't intercept - # keyboard interrupts.) - try: - # Don't blink! This is where the user's code gets run. - exec_(compile(example.source, filename, "single", - compileflags, 1), test.globs) - self.debugger.set_continue() # ==== Example Finished ==== - exception = None - except KeyboardInterrupt: - raise - except: - exception = sys.exc_info() - self.debugger.set_continue() # ==== Example Finished ==== - - got = self._fakeout.getvalue() # the actual output - self._fakeout.truncate(0) - outcome = FAILURE # guilty until proved innocent or insane - - # If the example executed without raising any exceptions, - # verify its output. - if exception is None: - if check(example.want, got, self.optionflags): - outcome = SUCCESS - - # The example raised an exception: check if it was expected. - else: - exc_info = sys.exc_info() - exc_msg = traceback.format_exception_only(*exc_info[:2])[-1] - if not quiet: - got += _exception_traceback(exc_info) - - # If `example.exc_msg` is None, then we weren't expecting - # an exception. - if example.exc_msg is None: - outcome = BOOM - - # We expected an exception: see whether it matches. - elif check(example.exc_msg, exc_msg, self.optionflags): - outcome = SUCCESS - - # Another chance if they didn't care about the detail. - elif self.optionflags & IGNORE_EXCEPTION_DETAIL: - m1 = re.match(r'[^:]*:', example.exc_msg) - m2 = re.match(r'[^:]*:', exc_msg) - if m1 and m2 and check(m1.group(0), m2.group(0), - self.optionflags): - outcome = SUCCESS - - # Report the outcome. - if outcome is SUCCESS: - if not quiet: - self.report_success(out, test, example, got) - elif outcome is FAILURE: - if not quiet: - self.report_failure(out, test, example, got) - failures += 1 - elif outcome is BOOM: - if not quiet: - self.report_unexpected_exception(out, test, example, - exc_info) - failures += 1 - else: - assert False, ("unknown outcome", outcome) - - # Restore the option flags (in case they were modified) - self.optionflags = original_optionflags - - # Record and return the number of failures and tries. - self.__record_outcome(test, failures, tries) - return failures, tries - - def __record_outcome(self, test, f, t): - """ - Record the fact that the given DocTest (`test`) generated `f` - failures out of `t` tried examples. - """ - f2, t2 = self._name2ft.get(test.name, (0,0)) - self._name2ft[test.name] = (f+f2, t+t2) - self.failures += f - self.tries += t - - __LINECACHE_FILENAME_RE = re.compile(r'[\w\.]+)' - r'\[(?P\d+)\]>$') - def __patched_linecache_getlines(self, filename, module_globals=None): - m = self.__LINECACHE_FILENAME_RE.match(filename) - if m and m.group('name') == self.test.name: - example = self.test.examples[int(m.group('examplenum'))] - return example.source.splitlines(True) - elif func_code(self.save_linecache_getlines).co_argcount > 1: - return self.save_linecache_getlines(filename, module_globals) - else: - return self.save_linecache_getlines(filename) - - def run(self, test, compileflags=None, out=None, clear_globs=True): - """ - Run the examples in `test`, and display the results using the - writer function `out`. - - The examples are run in the namespace `test.globs`. If - `clear_globs` is true (the default), then this namespace will - be cleared after the test runs, to help with garbage - collection. If you would like to examine the namespace after - the test completes, then use `clear_globs=False`. - - `compileflags` gives the set of flags that should be used by - the Python compiler when running the examples. If not - specified, then it will default to the set of future-import - flags that apply to `globs`. - - The output of each example is checked using - `DocTestRunner.check_output`, and the results are formatted by - the `DocTestRunner.report_*` methods. - """ - self.test = test - - if compileflags is None: - compileflags = _extract_future_flags(test.globs) - - save_stdout = sys.stdout - if out is None: - out = save_stdout.write - sys.stdout = self._fakeout - - # Patch pdb.set_trace to restore sys.stdout during interactive - # debugging (so it's not still redirected to self._fakeout). - # Note that the interactive output will go to *our* - # save_stdout, even if that's not the real sys.stdout; this - # allows us to write test cases for the set_trace behavior. - save_set_trace = pdb.set_trace - self.debugger = _OutputRedirectingPdb(save_stdout) - self.debugger.reset() - pdb.set_trace = self.debugger.set_trace - - # Patch linecache.getlines, so we can see the example's source - # when we're inside the debugger. - self.save_linecache_getlines = linecache.getlines - linecache.getlines = self.__patched_linecache_getlines - - try: - return self.__run(test, compileflags, out) - finally: - sys.stdout = save_stdout - pdb.set_trace = save_set_trace - linecache.getlines = self.save_linecache_getlines - if clear_globs: - test.globs.clear() - - #///////////////////////////////////////////////////////////////// - # Summarization - #///////////////////////////////////////////////////////////////// - def summarize(self, verbose=None): - """ - Print a summary of all the test cases that have been run by - this DocTestRunner, and return a tuple `(f, t)`, where `f` is - the total number of failed examples, and `t` is the total - number of tried examples. - - The optional `verbose` argument controls how detailed the - summary is. If the verbosity is not specified, then the - DocTestRunner's verbosity is used. - """ - if verbose is None: - verbose = self._verbose - notests = [] - passed = [] - failed = [] - totalt = totalf = 0 - for x in self._name2ft.items(): - name, (f, t) = x - assert f <= t - totalt += t - totalf += f - if t == 0: - notests.append(name) - elif f == 0: - passed.append( (name, t) ) - else: - failed.append(x) - if verbose: - if notests: - print(len(notests), "items had no tests:") - notests.sort() - for thing in notests: - print(" ", thing) - if passed: - print(len(passed), "items passed all tests:") - passed.sort() - for thing, count in passed: - print(" %3d tests in %s" % (count, thing)) - if failed: - print(self.DIVIDER) - print(len(failed), "items had failures:") - failed.sort() - for thing, (f, t) in failed: - print(" %3d of %3d in %s" % (f, t, thing)) - if verbose: - print(totalt, "tests in", len(self._name2ft), "items.") - print(totalt - totalf, "passed and", totalf, "failed.") - if totalf: - print("***Test Failed***", totalf, "failures.") - elif verbose: - print("Test passed.") - return totalf, totalt - - #///////////////////////////////////////////////////////////////// - # Backward compatibility cruft to maintain doctest.master. - #///////////////////////////////////////////////////////////////// - def merge(self, other): - d = self._name2ft - for name, (f, t) in other._name2ft.items(): - if name in d: - print("*** DocTestRunner.merge: '" + name + "' in both" \ - " testers; summing outcomes.") - f2, t2 = d[name] - f = f + f2 - t = t + t2 - d[name] = f, t - -class OutputChecker: - """ - A class used to check the whether the actual output from a doctest - example matches the expected output. `OutputChecker` defines two - methods: `check_output`, which compares a given pair of outputs, - and returns true if they match; and `output_difference`, which - returns a string describing the differences between two outputs. - """ - def check_output(self, want, got, optionflags): - """ - Return True iff the actual output from an example (`got`) - matches the expected output (`want`). These strings are - always considered to match if they are identical; but - depending on what option flags the test runner is using, - several non-exact match types are also possible. See the - documentation for `TestRunner` for more information about - option flags. - """ - # Handle the common case first, for efficiency: - # if they're string-identical, always return true. - if got == want: - return True - - # The values True and False replaced 1 and 0 as the return - # value for boolean comparisons in Python 2.3. - if not (optionflags & DONT_ACCEPT_TRUE_FOR_1): - if (got,want) == ("True\n", "1\n"): - return True - if (got,want) == ("False\n", "0\n"): - return True - - # can be used as a special sequence to signify a - # blank line, unless the DONT_ACCEPT_BLANKLINE flag is used. - if not (optionflags & DONT_ACCEPT_BLANKLINE): - # Replace in want with a blank line. - want = re.sub('(?m)^%s\s*?$' % re.escape(BLANKLINE_MARKER), - '', want) - # If a line in got contains only spaces, then remove the - # spaces. - got = re.sub('(?m)^\s*?$', '', got) - if got == want: - return True - - # This flag causes doctest to ignore any differences in the - # contents of whitespace strings. Note that this can be used - # in conjunction with the ELLIPSIS flag. - if optionflags & NORMALIZE_WHITESPACE: - got = ' '.join(got.split()) - want = ' '.join(want.split()) - if got == want: - return True - - # The ELLIPSIS flag says to let the sequence "..." in `want` - # match any substring in `got`. - if optionflags & ELLIPSIS: - if _ellipsis_match(want, got): - return True - - # We didn't find any match; return false. - return False - - # Should we do a fancy diff? - def _do_a_fancy_diff(self, want, got, optionflags): - # Not unless they asked for a fancy diff. - if not optionflags & (REPORT_UDIFF | - REPORT_CDIFF | - REPORT_NDIFF): - return False - - # If expected output uses ellipsis, a meaningful fancy diff is - # too hard ... or maybe not. In two real-life failures Tim saw, - # a diff was a major help anyway, so this is commented out. - # [todo] _ellipsis_match() knows which pieces do and don't match, - # and could be the basis for a kick-ass diff in this case. - ##if optionflags & ELLIPSIS and ELLIPSIS_MARKER in want: - ## return False - - # ndiff does intraline difference marking, so can be useful even - # for 1-line differences. - if optionflags & REPORT_NDIFF: - return True - - # The other diff types need at least a few lines to be helpful. - return want.count('\n') > 2 and got.count('\n') > 2 - - def output_difference(self, example, got, optionflags): - """ - Return a string describing the differences between the - expected output for a given example (`example`) and the actual - output (`got`). `optionflags` is the set of option flags used - to compare `want` and `got`. - """ - want = example.want - # If s are being used, then replace blank lines - # with in the actual output string. - if not (optionflags & DONT_ACCEPT_BLANKLINE): - got = re.sub('(?m)^[ ]*(?=\n)', BLANKLINE_MARKER, got) - - # Check if we should use diff. - if self._do_a_fancy_diff(want, got, optionflags): - # Split want & got into lines. - want_lines = want.splitlines(True) # True == keep line ends - got_lines = got.splitlines(True) - # Use difflib to find their differences. - if optionflags & REPORT_UDIFF: - diff = difflib.unified_diff(want_lines, got_lines, n=2) - diff = list(diff)[2:] # strip the diff header - kind = 'unified diff with -expected +actual' - elif optionflags & REPORT_CDIFF: - diff = difflib.context_diff(want_lines, got_lines, n=2) - diff = list(diff)[2:] # strip the diff header - kind = 'context diff with expected followed by actual' - elif optionflags & REPORT_NDIFF: - engine = difflib.Differ(charjunk=difflib.IS_CHARACTER_JUNK) - diff = list(engine.compare(want_lines, got_lines)) - kind = 'ndiff with -expected +actual' - else: - assert 0, 'Bad diff option' - # Remove trailing whitespace on diff output. - diff = [line.rstrip() + '\n' for line in diff] - return 'Differences (%s):\n' % kind + _indent(''.join(diff)) - - # If we're not using diff, then simply list the expected - # output followed by the actual output. - if want and got: - return 'Expected:\n%sGot:\n%s' % (_indent(want), _indent(got)) - elif want: - return 'Expected:\n%sGot nothing\n' % _indent(want) - elif got: - return 'Expected nothing\nGot:\n%s' % _indent(got) - else: - return 'Expected nothing\nGot nothing\n' - -class DocTestFailure(Exception): - """A DocTest example has failed in debugging mode. - - The exception instance has variables: - - - test: the DocTest object being run - - - excample: the Example object that failed - - - got: the actual output - """ - def __init__(self, test, example, got): - self.test = test - self.example = example - self.got = got - - def __str__(self): - return str(self.test) - -class UnexpectedException(Exception): - """A DocTest example has encountered an unexpected exception - - The exception instance has variables: - - - test: the DocTest object being run - - - excample: the Example object that failed - - - exc_info: the exception info - """ - def __init__(self, test, example, exc_info): - self.test = test - self.example = example - self.exc_info = exc_info - - def __str__(self): - return str(self.test) - -class DebugRunner(DocTestRunner): - r"""Run doc tests but raise an exception as soon as there is a failure. - - If an unexpected exception occurs, an UnexpectedException is raised. - It contains the test, the example, and the original exception: - - >>> runner = DebugRunner(verbose=False) - >>> test = DocTestParser().get_doctest('>>> raise KeyError\n42', - ... {}, 'foo', 'foo.py', 0) - >>> try: - ... runner.run(test) - ... except UnexpectedException, failure: - ... pass - - >>> failure.test is test - True - - >>> failure.example.want - '42\n' - - >>> exc_info = failure.exc_info - >>> raise exc_info[0], exc_info[1], exc_info[2] - Traceback (most recent call last): - ... - KeyError - - We wrap the original exception to give the calling application - access to the test and example information. - - If the output doesn't match, then a DocTestFailure is raised: - - >>> test = DocTestParser().get_doctest(''' - ... >>> x = 1 - ... >>> x - ... 2 - ... ''', {}, 'foo', 'foo.py', 0) - - >>> try: - ... runner.run(test) - ... except DocTestFailure, failure: - ... pass - - DocTestFailure objects provide access to the test: - - >>> failure.test is test - True - - As well as to the example: - - >>> failure.example.want - '2\n' - - and the actual output: - - >>> failure.got - '1\n' - - If a failure or error occurs, the globals are left intact: - - >>> del test.globs['__builtins__'] - >>> test.globs - {'x': 1} - - >>> test = DocTestParser().get_doctest(''' - ... >>> x = 2 - ... >>> raise KeyError - ... ''', {}, 'foo', 'foo.py', 0) - - >>> runner.run(test) - Traceback (most recent call last): - ... - UnexpectedException: - - >>> del test.globs['__builtins__'] - >>> test.globs - {'x': 2} - - But the globals are cleared if there is no error: - - >>> test = DocTestParser().get_doctest(''' - ... >>> x = 2 - ... ''', {}, 'foo', 'foo.py', 0) - - >>> runner.run(test) - (0, 1) - - >>> test.globs - {} - - """ - - def run(self, test, compileflags=None, out=None, clear_globs=True): - r = DocTestRunner.run(self, test, compileflags, out, False) - if clear_globs: - test.globs.clear() - return r - - def report_unexpected_exception(self, out, test, example, exc_info): - raise UnexpectedException(test, example, exc_info) - - def report_failure(self, out, test, example, got): - raise DocTestFailure(test, example, got) - -###################################################################### -## 6. Test Functions -###################################################################### -# These should be backwards compatible. - -# For backward compatibility, a global instance of a DocTestRunner -# class, updated by testmod. -master = None - -def testmod(m=None, name=None, globs=None, verbose=None, isprivate=None, - report=True, optionflags=0, extraglobs=None, - raise_on_error=False, exclude_empty=False): - """m=None, name=None, globs=None, verbose=None, isprivate=None, - report=True, optionflags=0, extraglobs=None, raise_on_error=False, - exclude_empty=False - - Test examples in docstrings in functions and classes reachable - from module m (or the current module if m is not supplied), starting - with m.__doc__. Unless isprivate is specified, private names - are not skipped. - - Also test examples reachable from dict m.__test__ if it exists and is - not None. m.__test__ maps names to functions, classes and strings; - function and class docstrings are tested even if the name is private; - strings are tested directly, as if they were docstrings. - - Return (#failures, #tests). - - See doctest.__doc__ for an overview. - - Optional keyword arg "name" gives the name of the module; by default - use m.__name__. - - Optional keyword arg "globs" gives a dict to be used as the globals - when executing examples; by default, use m.__dict__. A copy of this - dict is actually used for each docstring, so that each docstring's - examples start with a clean slate. - - Optional keyword arg "extraglobs" gives a dictionary that should be - merged into the globals that are used to execute examples. By - default, no extra globals are used. This is new in 2.4. - - Optional keyword arg "verbose" prints lots of stuff if true, prints - only failures if false; by default, it's true iff "-v" is in sys.argv. - - Optional keyword arg "report" prints a summary at the end when true, - else prints nothing at the end. In verbose mode, the summary is - detailed, else very brief (in fact, empty if all tests passed). - - Optional keyword arg "optionflags" or's together module constants, - and defaults to 0. This is new in 2.3. Possible values (see the - docs for details): - - DONT_ACCEPT_TRUE_FOR_1 - DONT_ACCEPT_BLANKLINE - NORMALIZE_WHITESPACE - ELLIPSIS - IGNORE_EXCEPTION_DETAIL - REPORT_UDIFF - REPORT_CDIFF - REPORT_NDIFF - REPORT_ONLY_FIRST_FAILURE - - Optional keyword arg "raise_on_error" raises an exception on the - first unexpected exception or failure. This allows failures to be - post-mortem debugged. - - Deprecated in Python 2.4: - Optional keyword arg "isprivate" specifies a function used to - determine whether a name is private. The default function is - treat all functions as public. Optionally, "isprivate" can be - set to doctest.is_private to skip over functions marked as private - using the underscore naming convention; see its docs for details. - - Advanced tomfoolery: testmod runs methods of a local instance of - class doctest.Tester, then merges the results into (or creates) - global Tester instance doctest.master. Methods of doctest.master - can be called directly too, if you want to do something unusual. - Passing report=0 to testmod is especially useful then, to delay - displaying a summary. Invoke doctest.master.summarize(verbose) - when you're done fiddling. - """ - global master - - if isprivate is not None: - warnings.warn("the isprivate argument is deprecated; " - "examine DocTestFinder.find() lists instead", - DeprecationWarning) - - # If no module was given, then use __main__. - if m is None: - # DWA - m will still be None if this wasn't invoked from the command - # line, in which case the following TypeError is about as good an error - # as we should expect - m = sys.modules.get('__main__') - - # Check that we were actually given a module. - if not inspect.ismodule(m): - raise TypeError("testmod: module required; %r" % (m,)) - - # If no name was given, then use the module's name. - if name is None: - name = m.__name__ - - # Find, parse, and run all tests in the given module. - finder = DocTestFinder(_namefilter=isprivate, exclude_empty=exclude_empty) - - if raise_on_error: - runner = DebugRunner(verbose=verbose, optionflags=optionflags) - else: - runner = DocTestRunner(verbose=verbose, optionflags=optionflags) - - for test in finder.find(m, name, globs=globs, extraglobs=extraglobs): - runner.run(test) - - if report: - runner.summarize() - - if master is None: - master = runner - else: - master.merge(runner) - - return runner.failures, runner.tries - -def testfile(filename, module_relative=True, name=None, package=None, - globs=None, verbose=None, report=True, optionflags=0, - extraglobs=None, raise_on_error=False, parser=DocTestParser()): - """ - Test examples in the given file. Return (#failures, #tests). - - Optional keyword arg "module_relative" specifies how filenames - should be interpreted: - - - If "module_relative" is True (the default), then "filename" - specifies a module-relative path. By default, this path is - relative to the calling module's directory; but if the - "package" argument is specified, then it is relative to that - package. To ensure os-independence, "filename" should use - "/" characters to separate path segments, and should not - be an absolute path (i.e., it may not begin with "/"). - - - If "module_relative" is False, then "filename" specifies an - os-specific path. The path may be absolute or relative (to - the current working directory). - - Optional keyword arg "name" gives the name of the test; by default - use the file's basename. - - Optional keyword argument "package" is a Python package or the - name of a Python package whose directory should be used as the - base directory for a module relative filename. If no package is - specified, then the calling module's directory is used as the base - directory for module relative filenames. It is an error to - specify "package" if "module_relative" is False. - - Optional keyword arg "globs" gives a dict to be used as the globals - when executing examples; by default, use {}. A copy of this dict - is actually used for each docstring, so that each docstring's - examples start with a clean slate. - - Optional keyword arg "extraglobs" gives a dictionary that should be - merged into the globals that are used to execute examples. By - default, no extra globals are used. - - Optional keyword arg "verbose" prints lots of stuff if true, prints - only failures if false; by default, it's true iff "-v" is in sys.argv. - - Optional keyword arg "report" prints a summary at the end when true, - else prints nothing at the end. In verbose mode, the summary is - detailed, else very brief (in fact, empty if all tests passed). - - Optional keyword arg "optionflags" or's together module constants, - and defaults to 0. Possible values (see the docs for details): - - DONT_ACCEPT_TRUE_FOR_1 - DONT_ACCEPT_BLANKLINE - NORMALIZE_WHITESPACE - ELLIPSIS - IGNORE_EXCEPTION_DETAIL - REPORT_UDIFF - REPORT_CDIFF - REPORT_NDIFF - REPORT_ONLY_FIRST_FAILURE - - Optional keyword arg "raise_on_error" raises an exception on the - first unexpected exception or failure. This allows failures to be - post-mortem debugged. - - Optional keyword arg "parser" specifies a DocTestParser (or - subclass) that should be used to extract tests from the files. - - Advanced tomfoolery: testmod runs methods of a local instance of - class doctest.Tester, then merges the results into (or creates) - global Tester instance doctest.master. Methods of doctest.master - can be called directly too, if you want to do something unusual. - Passing report=0 to testmod is especially useful then, to delay - displaying a summary. Invoke doctest.master.summarize(verbose) - when you're done fiddling. - """ - global master - - if package and not module_relative: - raise ValueError("Package may only be specified for module-" - "relative paths.") - - # Relativize the path - if module_relative: - package = _normalize_module(package) - filename = _module_relative_path(package, filename) - - # If no name was given, then use the file's name. - if name is None: - name = os.path.basename(filename) - - # Assemble the globals. - if globs is None: - globs = {} - else: - globs = globs.copy() - if extraglobs is not None: - globs.update(extraglobs) - - if raise_on_error: - runner = DebugRunner(verbose=verbose, optionflags=optionflags) - else: - runner = DocTestRunner(verbose=verbose, optionflags=optionflags) - - # Read the file, convert it to a test, and run it. - f = open(filename) - s = f.read() - f.close() - test = parser.get_doctest(s, globs, name, filename, 0) - runner.run(test) - - if report: - runner.summarize() - - if master is None: - master = runner - else: - master.merge(runner) - - return runner.failures, runner.tries - -def run_docstring_examples(f, globs, verbose=False, name="NoName", - compileflags=None, optionflags=0): - """ - Test examples in the given object's docstring (`f`), using `globs` - as globals. Optional argument `name` is used in failure messages. - If the optional argument `verbose` is true, then generate output - even if there are no failures. - - `compileflags` gives the set of flags that should be used by the - Python compiler when running the examples. If not specified, then - it will default to the set of future-import flags that apply to - `globs`. - - Optional keyword arg `optionflags` specifies options for the - testing and output. See the documentation for `testmod` for more - information. - """ - # Find, parse, and run all tests in the given module. - finder = DocTestFinder(verbose=verbose, recurse=False) - runner = DocTestRunner(verbose=verbose, optionflags=optionflags) - for test in finder.find(f, name, globs=globs): - runner.run(test, compileflags=compileflags) - -###################################################################### -## 7. Tester -###################################################################### -# This is provided only for backwards compatibility. It's not -# actually used in any way. - -class Tester: - def __init__(self, mod=None, globs=None, verbose=None, - isprivate=None, optionflags=0): - - warnings.warn("class Tester is deprecated; " - "use class doctest.DocTestRunner instead", - DeprecationWarning, stacklevel=2) - if mod is None and globs is None: - raise TypeError("Tester.__init__: must specify mod or globs") - if mod is not None and not inspect.ismodule(mod): - raise TypeError("Tester.__init__: mod must be a module; %r" % - (mod,)) - if globs is None: - globs = mod.__dict__ - self.globs = globs - - self.verbose = verbose - self.isprivate = isprivate - self.optionflags = optionflags - self.testfinder = DocTestFinder(_namefilter=isprivate) - self.testrunner = DocTestRunner(verbose=verbose, - optionflags=optionflags) - - def runstring(self, s, name): - test = DocTestParser().get_doctest(s, self.globs, name, None, None) - if self.verbose: - print("Running string", name) - (f,t) = self.testrunner.run(test) - if self.verbose: - print(f, "of", t, "examples failed in string", name) - return (f,t) - - def rundoc(self, object, name=None, module=None): - f = t = 0 - tests = self.testfinder.find(object, name, module=module, - globs=self.globs) - for test in tests: - (f2, t2) = self.testrunner.run(test) - (f,t) = (f+f2, t+t2) - return (f,t) - - def rundict(self, d, name, module=None): - import types - m = types.ModuleType(name) - m.__dict__.update(d) - if module is None: - module = False - return self.rundoc(m, name, module) - - def run__test__(self, d, name): - import types - m = types.ModuleType(name) - m.__test__ = d - return self.rundoc(m, name) - - def summarize(self, verbose=None): - return self.testrunner.summarize(verbose) - - def merge(self, other): - self.testrunner.merge(other.testrunner) - -###################################################################### -## 8. Unittest Support -###################################################################### - -_unittest_reportflags = 0 - -def set_unittest_reportflags(flags): - """Sets the unittest option flags. - - The old flag is returned so that a runner could restore the old - value if it wished to: - - >>> old = _unittest_reportflags - >>> set_unittest_reportflags(REPORT_NDIFF | - ... REPORT_ONLY_FIRST_FAILURE) == old - True - - >>> import doctest - >>> doctest._unittest_reportflags == (REPORT_NDIFF | - ... REPORT_ONLY_FIRST_FAILURE) - True - - Only reporting flags can be set: - - >>> set_unittest_reportflags(ELLIPSIS) - Traceback (most recent call last): - ... - ValueError: ('Only reporting flags allowed', 8) - - >>> set_unittest_reportflags(old) == (REPORT_NDIFF | - ... REPORT_ONLY_FIRST_FAILURE) - True - """ - global _unittest_reportflags - - if (flags & REPORTING_FLAGS) != flags: - raise ValueError("Only reporting flags allowed", flags) - old = _unittest_reportflags - _unittest_reportflags = flags - return old - - -class DocTestCase(unittest.TestCase): - - def __init__(self, test, optionflags=0, setUp=None, tearDown=None, - checker=None): - - unittest.TestCase.__init__(self) - self._dt_optionflags = optionflags - self._dt_checker = checker - self._dt_test = test - self._dt_setUp = setUp - self._dt_tearDown = tearDown - - def setUp(self): - test = self._dt_test - - if self._dt_setUp is not None: - self._dt_setUp(test) - - def tearDown(self): - test = self._dt_test - - if self._dt_tearDown is not None: - self._dt_tearDown(test) - - test.globs.clear() - - def runTest(self): - test = self._dt_test - old = sys.stdout - new = StringIO() - optionflags = self._dt_optionflags - - if not (optionflags & REPORTING_FLAGS): - # The option flags don't include any reporting flags, - # so add the default reporting flags - optionflags |= _unittest_reportflags - - runner = DocTestRunner(optionflags=optionflags, - checker=self._dt_checker, verbose=False) - - try: - runner.DIVIDER = "-"*70 - failures, tries = runner.run( - test, out=new.write, clear_globs=False) - finally: - sys.stdout = old - - if failures: - raise self.failureException(self.format_failure(new.getvalue())) - - def format_failure(self, err): - test = self._dt_test - if test.lineno is None: - lineno = 'unknown line number' - else: - lineno = '%s' % test.lineno - lname = '.'.join(test.name.split('.')[-1:]) - return ('Failed doctest test for %s\n' - ' File "%s", line %s, in %s\n\n%s' - % (test.name, test.filename, lineno, lname, err) - ) - - def debug(self): - r"""Run the test case without results and without catching exceptions - - The unit test framework includes a debug method on test cases - and test suites to support post-mortem debugging. The test code - is run in such a way that errors are not caught. This way a - caller can catch the errors and initiate post-mortem debugging. - - The DocTestCase provides a debug method that raises - UnexpectedException errors if there is an unexepcted - exception: - - >>> test = DocTestParser().get_doctest('>>> raise KeyError\n42', - ... {}, 'foo', 'foo.py', 0) - >>> case = DocTestCase(test) - >>> try: - ... case.debug() - ... except UnexpectedException, failure: - ... pass - - The UnexpectedException contains the test, the example, and - the original exception: - - >>> failure.test is test - True - - >>> failure.example.want - '42\n' - - >>> exc_info = failure.exc_info - >>> raise exc_info[0], exc_info[1], exc_info[2] - Traceback (most recent call last): - ... - KeyError - - If the output doesn't match, then a DocTestFailure is raised: - - >>> test = DocTestParser().get_doctest(''' - ... >>> x = 1 - ... >>> x - ... 2 - ... ''', {}, 'foo', 'foo.py', 0) - >>> case = DocTestCase(test) - - >>> try: - ... case.debug() - ... except DocTestFailure, failure: - ... pass - - DocTestFailure objects provide access to the test: - - >>> failure.test is test - True - - As well as to the example: - - >>> failure.example.want - '2\n' - - and the actual output: - - >>> failure.got - '1\n' - - """ - - self.setUp() - runner = DebugRunner(optionflags=self._dt_optionflags, - checker=self._dt_checker, verbose=False) - runner.run(self._dt_test) - self.tearDown() - - def id(self): - return self._dt_test.name - - def __repr__(self): - name = self._dt_test.name.split('.') - return "%s (%s)" % (name[-1], '.'.join(name[:-1])) - - __str__ = __repr__ - - def shortDescription(self): - return "Doctest: " + self._dt_test.name - -def DocTestSuite(module=None, globs=None, extraglobs=None, test_finder=None, - **options): - """ - Convert doctest tests for a module to a unittest test suite. - - This converts each documentation string in a module that - contains doctest tests to a unittest test case. If any of the - tests in a doc string fail, then the test case fails. An exception - is raised showing the name of the file containing the test and a - (sometimes approximate) line number. - - The `module` argument provides the module to be tested. The argument - can be either a module or a module name. - - If no argument is given, the calling module is used. - - A number of options may be provided as keyword arguments: - - setUp - A set-up function. This is called before running the - tests in each file. The setUp function will be passed a DocTest - object. The setUp function can access the test globals as the - globs attribute of the test passed. - - tearDown - A tear-down function. This is called after running the - tests in each file. The tearDown function will be passed a DocTest - object. The tearDown function can access the test globals as the - globs attribute of the test passed. - - globs - A dictionary containing initial global variables for the tests. - - optionflags - A set of doctest option flags expressed as an integer. - """ - - if test_finder is None: - test_finder = DocTestFinder() - - module = _normalize_module(module) - tests = test_finder.find(module, globs=globs, extraglobs=extraglobs) - if globs is None: - globs = module.__dict__ - if not tests: - # Why do we want to do this? Because it reveals a bug that might - # otherwise be hidden. - raise ValueError(module, "has no tests") - - tests.sort() - suite = unittest.TestSuite() - for test in tests: - if len(test.examples) == 0: - continue - if not test.filename: - filename = module.__file__ - if filename[-4:] in (".pyc", ".pyo"): - filename = filename[:-1] - test.filename = filename - suite.addTest(DocTestCase(test, **options)) - - return suite - -class DocFileCase(DocTestCase): - - def id(self): - return '_'.join(self._dt_test.name.split('.')) - - def __repr__(self): - return self._dt_test.filename - __str__ = __repr__ - - def format_failure(self, err): - return ('Failed doctest test for %s\n File "%s", line 0\n\n%s' - % (self._dt_test.name, self._dt_test.filename, err) - ) - -def DocFileTest(path, module_relative=True, package=None, - globs=None, parser=DocTestParser(), **options): - if globs is None: - globs = {} - - if package and not module_relative: - raise ValueError("Package may only be specified for module-" - "relative paths.") - - # Relativize the path. - if module_relative: - package = _normalize_module(package) - path = _module_relative_path(package, path) - - # Find the file and read it. - name = os.path.basename(path) - f = open(path) - doc = f.read() - f.close() - - # Convert it to a test, and wrap it in a DocFileCase. - test = parser.get_doctest(doc, globs, name, path, 0) - return DocFileCase(test, **options) - -def DocFileSuite(*paths, **kw): - """A unittest suite for one or more doctest files. - - The path to each doctest file is given as a string; the - interpretation of that string depends on the keyword argument - "module_relative". - - A number of options may be provided as keyword arguments: - - module_relative - If "module_relative" is True, then the given file paths are - interpreted as os-independent module-relative paths. By - default, these paths are relative to the calling module's - directory; but if the "package" argument is specified, then - they are relative to that package. To ensure os-independence, - "filename" should use "/" characters to separate path - segments, and may not be an absolute path (i.e., it may not - begin with "/"). - - If "module_relative" is False, then the given file paths are - interpreted as os-specific paths. These paths may be absolute - or relative (to the current working directory). - - package - A Python package or the name of a Python package whose directory - should be used as the base directory for module relative paths. - If "package" is not specified, then the calling module's - directory is used as the base directory for module relative - filenames. It is an error to specify "package" if - "module_relative" is False. - - setUp - A set-up function. This is called before running the - tests in each file. The setUp function will be passed a DocTest - object. The setUp function can access the test globals as the - globs attribute of the test passed. - - tearDown - A tear-down function. This is called after running the - tests in each file. The tearDown function will be passed a DocTest - object. The tearDown function can access the test globals as the - globs attribute of the test passed. - - globs - A dictionary containing initial global variables for the tests. - - optionflags - A set of doctest option flags expressed as an integer. - - parser - A DocTestParser (or subclass) that should be used to extract - tests from the files. - """ - suite = unittest.TestSuite() - - # We do this here so that _normalize_module is called at the right - # level. If it were called in DocFileTest, then this function - # would be the caller and we might guess the package incorrectly. - if kw.get('module_relative', True): - kw['package'] = _normalize_module(kw.get('package')) - - for path in paths: - suite.addTest(DocFileTest(path, **kw)) - - return suite - -###################################################################### -## 9. Debugging Support -###################################################################### - -def script_from_examples(s): - r"""Extract script from text with examples. - - Converts text with examples to a Python script. Example input is - converted to regular code. Example output and all other words - are converted to comments: - - >>> text = ''' - ... Here are examples of simple math. - ... - ... Python has super accurate integer addition - ... - ... >>> 2 + 2 - ... 5 - ... - ... And very friendly error messages: - ... - ... >>> 1/0 - ... To Infinity - ... And - ... Beyond - ... - ... You can use logic if you want: - ... - ... >>> if 0: - ... ... blah - ... ... blah - ... ... - ... - ... Ho hum - ... ''' - - >>> print script_from_examples(text) - # Here are examples of simple math. - # - # Python has super accurate integer addition - # - 2 + 2 - # Expected: - ## 5 - # - # And very friendly error messages: - # - 1/0 - # Expected: - ## To Infinity - ## And - ## Beyond - # - # You can use logic if you want: - # - if 0: - blah - blah - # - # Ho hum - """ - output = [] - for piece in DocTestParser().parse(s): - if isinstance(piece, Example): - # Add the example's source code (strip trailing NL) - output.append(piece.source[:-1]) - # Add the expected output: - want = piece.want - if want: - output.append('# Expected:') - output += ['## '+l for l in want.split('\n')[:-1]] - else: - # Add non-example text. - output += [_comment_line(l) - for l in piece.split('\n')[:-1]] - - # Trim junk on both ends. - while output and output[-1] == '#': - output.pop() - while output and output[0] == '#': - output.pop(0) - # Combine the output, and return it. - return '\n'.join(output) - -def testsource(module, name): - """Extract the test sources from a doctest docstring as a script. - - Provide the module (or dotted name of the module) containing the - test to be debugged and the name (within the module) of the object - with the doc string with tests to be debugged. - """ - module = _normalize_module(module) - tests = DocTestFinder().find(module) - test = [t for t in tests if t.name == name] - if not test: - raise ValueError(name, "not found in tests") - test = test[0] - testsrc = script_from_examples(test.docstring) - return testsrc - -def debug_src(src, pm=False, globs=None): - """Debug a single doctest docstring, in argument `src`'""" - testsrc = script_from_examples(src) - debug_script(testsrc, pm, globs) - -def debug_script(src, pm=False, globs=None): - "Debug a test script. `src` is the script, as a string." - import pdb - - # Note that tempfile.NameTemporaryFile() cannot be used. As the - # docs say, a file so created cannot be opened by name a second time - # on modern Windows boxes, and execfile() needs to open it. - srcfilename = tempfile.mktemp(".py", "doctestdebug") - f = open(srcfilename, 'w') - f.write(src) - f.close() - - try: - if globs: - globs = globs.copy() - else: - globs = {} - - if pm: - try: - execfile(srcfilename, globs, globs) - except: - print(sys.exc_info()[1]) - pdb.post_mortem(sys.exc_info()[2]) - else: - # Note that %r is vital here. '%s' instead can, e.g., cause - # backslashes to get treated as metacharacters on Windows. - pdb.run("execfile(%r)" % srcfilename, globs, globs) - - finally: - os.remove(srcfilename) - -def debug(module, name, pm=False): - """Debug a single doctest docstring. - - Provide the module (or dotted name of the module) containing the - test to be debugged and the name (within the module) of the object - with the docstring with tests to be debugged. - """ - module = _normalize_module(module) - testsrc = testsource(module, name) - debug_script(testsrc, pm, module.__dict__) - -###################################################################### -## 10. Example Usage -###################################################################### -class _TestClass: - """ - A pointless class, for sanity-checking of docstring testing. - - Methods: - square() - get() - - >>> _TestClass(13).get() + _TestClass(-12).get() - 1 - >>> hex(_TestClass(13).square().get()) - '0xa9' - """ - - def __init__(self, val): - """val -> _TestClass object with associated value val. - - >>> t = _TestClass(123) - >>> print t.get() - 123 - """ - - self.val = val - - def square(self): - """square() -> square TestClass's associated value - - >>> _TestClass(13).square().get() - 169 - """ - - self.val = self.val ** 2 - return self - - def get(self): - """get() -> return TestClass's associated value. - - >>> x = _TestClass(-42) - >>> print x.get() - -42 - """ - - return self.val - -__test__ = {"_TestClass": _TestClass, - "string": r""" - Example of a string object, searched as-is. - >>> x = 1; y = 2 - >>> x + y, x * y - (3, 2) - """, - - "bool-int equivalence": r""" - In 2.2, boolean expressions displayed - 0 or 1. By default, we still accept - them. This can be disabled by passing - DONT_ACCEPT_TRUE_FOR_1 to the new - optionflags argument. - >>> 4 == 4 - 1 - >>> 4 == 4 - True - >>> 4 > 4 - 0 - >>> 4 > 4 - False - """, - - "blank lines": r""" - Blank lines can be marked with : - >>> print 'foo\n\nbar\n' - foo - - bar - - """, - - "ellipsis": r""" - If the ellipsis flag is used, then '...' can be used to - elide substrings in the desired output: - >>> print range(1000) #doctest: +ELLIPSIS - [0, 1, 2, ..., 999] - """, - - "whitespace normalization": r""" - If the whitespace normalization flag is used, then - differences in whitespace are ignored. - >>> print range(30) #doctest: +NORMALIZE_WHITESPACE - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29] - """, - } - -def _test(): - r = unittest.TextTestRunner() - r.run(DocTestSuite()) - -if __name__ == "__main__": - _test() - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/doctest.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/doctest.pyc deleted file mode 100644 index d13e765a006315592bd500b6ec9ce4edbaad99ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86303 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 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/py26compat.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/py26compat.py deleted file mode 100644 index d4fb891af..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/py26compat.py +++ /dev/null @@ -1,14 +0,0 @@ -import unittest - -try: - # provide skipIf for Python 2.4-2.6 - skipIf = unittest.skipIf -except AttributeError: - def skipIf(condition, reason): - def skipper(func): - def skip(*args, **kwargs): - return - if condition: - return skip - return func - return skipper diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/py26compat.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/py26compat.pyc deleted file mode 100644 index 14e2826abb8a5da651782d77e7741af1d55c0b4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 951 zcmcgq-D+Dg43k%n7FaF@Bdp0qN->P{4DZalQlvWq{LIUL3d-aqpS0~Q5OgcZOwz@`lv;3vX0 z!pxpSQzx)I1OE;Xu}I*KQ3w{{ie0AN2D_U_9^*V=RgTYl=2>jsmKm$Q=&YWr?;Bb;JF+*b-}|7xnM?&k`l3qn zWjfbE1xohn!k>9jWOBxZ)$7C%{7S>Zs4M}$= (2, 6): - urllib2.urlopen(url, timeout=5) - else: - urllib2.urlopen(url) - except URLError: - # ignore any errors; all that's important is the request - pass - self.thread.join() - self.socket.close() - - def base_url(self): - port = self.server_port - return 'http://127.0.0.1:%s/setuptools/tests/indexes/' % port - -class RequestRecorder(BaseHTTPRequestHandler): - def do_GET(self): - requests = vars(self.server).setdefault('requests', []) - requests.append(self) - self.send_response(200, 'OK') - -class MockServer(HTTPServer, threading.Thread): - """ - A simple HTTP Server that records the requests made to it. - """ - def __init__(self, server_address=('', 0), - RequestHandlerClass=RequestRecorder): - HTTPServer.__init__(self, server_address, RequestHandlerClass) - threading.Thread.__init__(self) - self.setDaemon(True) - self.requests = [] - - def run(self): - self.serve_forever() - - def url(self): - return 'http://localhost:%(server_port)s/' % vars(self) - url = property(url) diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/server.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/server.pyc deleted file mode 100644 index 301812d289f71f57432a01628b605822ab9686f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4663 zcmc&%+in|07@oBq$95B%QW08^U}-6JgyPU#P!w89kF=r6qm1?8+R9sT2r`jMKT~h7Rgf6RgS?ID#D{3&K+B3@IzKV>is$ErsS=F9ZgPLmB z)S#}~b?lf?x~8_Vuc}@ub)eLfc0M9ql;&{@VE2Ax7t|a+uS$FV3bBy`y2Zk4}7fjM#km?KgnYKT$@Jn zFP`i)MxEv*<=enkL;Lh81?p|9qshfX!v-Z}u` zIcP5VpZk{w`@BMSTs}PFq94P!`2e@_{=%6{Om6!V_Q?gGi~iPR&fiW_4H5eJD2@HD z_S3uvc*GDGa@o<)=6PyX1V1ZsCqUv(fkfatACB3!(6CC__2@!u6|~!E#z%+sT~EDG z>IM3eIw&j8mN*XKJOGGbZe5TS@MVEi7$#6@7+M~+RgAO{VKK^@vWL?~r`z@&A&B=d zisM2XW6xshRoLE6BV(GFR??X+sCccjli2>K+j*R1H`DDx$497cl6CIr?r5j8v2Xi% zb~k(0S#4eIJWRSBlUThx#)s)lmDLetVS?PWhWi2i1q{;*R0i+M>aL&UfrG+8Nv`5`REK1oh^og3?$b z=n@Er1O!Nm3nVDdp@2g~xQfUvGE>@hTje`Zv7>F1*H{r>JQqGHt6MS(2m-fT#*QiR zEGqkCG!qbpH1Aj`=bTa~8HEw0{0ibwDF@zB$0#Wv9*V*2;xC@s|58D!T?DzB+M7|u zI-~GzjXs6=heUGVd0sX@o#kndvoop!t?e~bkt=TS)X!9QL+zdtWpgm6cITbuXW@+0 zu{n)y6CRE*r^iul=l9?E{CUHCf<>m8wUw1Ct5;iJ;CE&1Qq#dc93l-YnU#ccCSpK( zflUTFAK8SGuQz4wa6?n9N91sqvt6q7P^f!RYP7>WcRY&nt77GN@j_#fAx3 zRpw{v-hx;5PJ4@`Gv0iu;>}MnM9~C8XF$-5N&zPHEdXXyBw9DiSbN=6W@Q?)UJdXo zF8@nSAyG`sc|<)_BQ1RV`l;dONjm%r^w_KFp5u;4OVE@6c$`AAXrPfo7#PEFkjJBx zL*g+EVj;w3$v;F6T}aS#4Fn<(0fe;UF)RZ^JBT|a;t60v zWX3AP2{)nc!j3YRy_m_H8eA8BPfCyEFP_O;e)wMEcECE&Ii9NvMLKO`y&a8GD=X0u z{u@*;d*~~D{j=E+*BTP+lOx6(Q;ynEB?$&kkMw}_{LwKUpA;G5@2A9~i&`sGB z>X>*8F5_w%(opGDPXPZ2G45@Z_1D;T2oP4*ReoW>s&A{THNH)lVpwGZO7tLe2b~mz zH~DRW8sBH-@4GvZI3gCKgeYoJWRVFv`~m82evl-#C9emEuKRlVNR_|2d}O^Kb;J~y zi02#ty8vp4OgXJB$*|Ox&es<>q?brVfnazi(t|t;YMiI#oNWoyfUz)OrkUFIxXenf z@1Ys;#qx1sk^tz-Y~sQU6Ld}al5|eVweh!{^C(oLAwCB+(&b4Oiwrv`;UD2ou&Ulr zC{i4RAQzNi(8FZ*2^Pl5jNdA0KR5QZy2DAwfOCR!1|Q@84YaY4|4&hZvuWh`3_Hb# z9XeMzV!=Ra+pepC`lo&I#yPmX0+o zFj~EQFpO+~NhJlEE6RujmwlP;ob-G#;Dsk6tEl^$D-*t9BsCPLimw^|7Q74P#nr{? Ee?DVWEC2ui diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_bdist_egg.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_bdist_egg.py deleted file mode 100644 index 1a1221864..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_bdist_egg.py +++ /dev/null @@ -1,69 +0,0 @@ -"""develop tests -""" -import sys -import os, re, shutil, tempfile, unittest -import tempfile -import site - -from distutils.errors import DistutilsError -from setuptools.compat import StringIO -from setuptools.command.bdist_egg import bdist_egg -from setuptools.command import easy_install as easy_install_pkg -from setuptools.dist import Distribution - -SETUP_PY = """\ -from setuptools import setup - -setup(name='foo', py_modules=['hi']) -""" - -class TestDevelopTest(unittest.TestCase): - - def setUp(self): - self.dir = tempfile.mkdtemp() - self.old_cwd = os.getcwd() - os.chdir(self.dir) - f = open('setup.py', 'w') - f.write(SETUP_PY) - f.close() - f = open('hi.py', 'w') - f.write('1\n') - f.close() - if sys.version >= "2.6": - self.old_base = site.USER_BASE - site.USER_BASE = tempfile.mkdtemp() - self.old_site = site.USER_SITE - site.USER_SITE = tempfile.mkdtemp() - - def tearDown(self): - os.chdir(self.old_cwd) - shutil.rmtree(self.dir) - if sys.version >= "2.6": - shutil.rmtree(site.USER_BASE) - shutil.rmtree(site.USER_SITE) - site.USER_BASE = self.old_base - site.USER_SITE = self.old_site - - def test_bdist_egg(self): - dist = Distribution(dict( - script_name='setup.py', - script_args=['bdist_egg'], - name='foo', - py_modules=['hi'] - )) - os.makedirs(os.path.join('build', 'src')) - old_stdout = sys.stdout - sys.stdout = o = StringIO() - try: - dist.parse_command_line() - dist.run_commands() - finally: - sys.stdout = old_stdout - - # let's see if we got our egg link at the right place - [content] = os.listdir('dist') - self.assertTrue(re.match('foo-0.0.0-py[23].\d.egg$', content)) - -def test_suite(): - return unittest.makeSuite(TestDevelopTest) - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_bdist_egg.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_bdist_egg.pyc deleted file mode 100644 index c49e3cd59a927887340cd4f2516decbb1af6ecf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3182 zcmc&$>uwuW5T5m|vEy8tUT8&yB7umJh)au91hj}Y$&X4Xly$1ot*e#o-Pr5w#oBY+ zC@B3^o{0zG2M>aH10DdrZ#KSE{3o_{Jaf*RIXky+T>g8l(ck^+r-592%J}^rkNFcM z5b;1A2}%+>;(;mnl6a*VUly-C<16A-W_(q=>Wr_6SDW$6>sQ3PqU&XeS0t&6R~LtO zR3vUlvMSzcAy*}CO0p*2S|QgYUYBG;yv;(sBJov8w#3_lydvH;3F;EoWPDwYVXh&+ zio6qf>D`cEm4bJZPIX#M`npbE!#81^O}1@ltZ795;B(k=uwl8o9~nEfQEU$KJj;vq z6|8q`9;L&lKNc%>tn>q@`r&X`EYW`0GiQF38rzHG#VSqaQ6E;b)a*g+IM0%86WZy- zW?5{uqhylhwpeL2bfcB_lJL>aahC0TzCAhflPs9Vp?UObXB6$c{;Xj)VCM)P>=)jU zou`)0Ji%i=1_==Y1V%I#no9-+i7e?#MchuS47~wQmGDs5!(;vcu_9xK0X-M-OJd71 zuFS-$iZyPHOY+VU#}+w;P?EQfoI5gJ5nINiM~!ZKa%So7si}gFBFKiW-)k6p zf4}{pwS`~H12#-1$59-@H<9Edpo}oUaFkmf%8aG?VQ2@Zfof%O;FG8E!H9Yl>P^B_ zmrnD@hHATWaP<6{|LkR<8E1GoS~h1!?Ys$dgPPIPhG$rI&pQXM|KxG!KrQg9eh=s7 zTb-vzi!GjN@g)lzVSKE9AGfe1O3WBs@J)9Z+0nG$eG#RPT)79W=O?S1sl=|~VVb~cHs6C(DBy$HuoDF<8 z@vJ$GIccqOk)<=fC|ZPTTvTFF#FSBwtT`N9 zWwQOc)^bz%#=LkKzr%T9tU+=cB+9YvHUDNr*ibf4Y#xR#Q{u9Y+-oG)Np6sQKtliB zTObM)?rm~-E+;ERq4)Cr>@@upFQGswND9+JdXWldkG^Xveggx1Kt&b9B0y7DWC#)C z08;=dSfTh%DhM<10PQj^E3Gh90B+zlK!8a=;E=PofS476L&| zcmYH^hqkKyOv|eTe3}+BqL+`*B_vW*i51zi8vTJ2`uG|I63yZqUXY z`J_cqcZn4j`U9(#hL8YydM6>E#OT(fXGhA6vnbUX)50@0$fnk1!&nyHq?en}A7n|= zO9MZS($KPA^JzL;EPy7)n-QkyP0yGxw@3LjRB!T7y-9j@FlsUVTB+_1I8`SA71t`V zWC~mZfEK{+^6HtBoCvhQp1WANfSbBgbNFnO?%;RRDFb%aOO5iDqYi4ceXR)JS0DY0 z@$38Uhm62SBo9Cq4l4IQW2wt@5LFE4Ppwqntk(zN^uu!1E@i0~Qylq3dvp|U4t3_M ztJ5^HjFpZMR#|5XP*>xZ>z~G6vuOB6>J8lzr$q$SO7s078z3(Vvx>_1u;p^DxE$E- z*CY&*-2`C^>c6{o$iH{S#hTcwAdAt}M!%rHiY}s|_qW(e?fFP6V1c*)SIaHaIIms) zU+7OxhWhVq=>T6#``)FtX5|PO*~4JhJh(H0{0;q%Sx_XaVK6+z(=2gF L=(koY-M;%TRR`3e diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_build_ext.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_build_ext.py deleted file mode 100644 index a520ced9d..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_build_ext.py +++ /dev/null @@ -1,20 +0,0 @@ -"""build_ext tests -""" -import os, shutil, tempfile, unittest -from distutils.command.build_ext import build_ext as distutils_build_ext -from setuptools.command.build_ext import build_ext -from setuptools.dist import Distribution - -class TestBuildExtTest(unittest.TestCase): - - def test_get_ext_filename(self): - # setuptools needs to give back the same - # result than distutils, even if the fullname - # is not in ext_map - dist = Distribution() - cmd = build_ext(dist) - cmd.ext_map['foo/bar'] = '' - res = cmd.get_ext_filename('foo') - wanted = distutils_build_ext.get_ext_filename(cmd, 'foo') - assert res == wanted - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_build_ext.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_build_ext.pyc deleted file mode 100644 index 590ef8a8e20cf93a2ba8714416d054e35c1ba82c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1267 zcmc&z&2G~`5T3Q2v* z4R`?fW<%2g4^T%t`_1g^{CuR$LRFrvCD2f1<*rUk1 z#y&;{oK z!!;>p3nFdvBGcxapRuuQ`}r??N1?(I_imprO&c&BLegQ=)J-T&qD&+<#l!)* z=rWJX%Z?&MAB!}$e2Mmjmu|MuI*ft5EvK~HU{ zf!b6LRVd`~I)v6jiqxfM`mti}lt#TGx_z8ShQy-4&vP`OMxSGCuJ0p2J{1oDb@c&(T^KS=<>fWDA gD1WB?#2Q!q-4f{P*;!8Xjc{dU#$EM7ZOPC34NP7c1iS-z2cV9G_y3#vrJaBVHI18~8` zF0?ZcO%~-B`V*YzJm-7z3;Bb5Kytbl06~=>@??>PK~K+2&!tbFZaDv0c29Qx{cVq? ze-6ICz(@ZJO-R&1Yf)%ZY*7b7F5A?xXR<>bXC@b@Q<%v`>J(@4qP|3(lIR_Z%QUJ` zr$QFnEl^ygkxLyn?-wavqEU@H%Xz;<@d}OV)T!tFGR3PjTBFVy`Y^LjVU;=?6uP8} zG`vH77+s>DiLQyh>)hpAw3{`)+zMY#y;gBLZWyJFcBB8|@33iM!0_l^q|L-cvEI+J zG|Tnnn^n1jZK*(C_)(%w5XZT;0&Ux5Q8GCA=4Kun%%T(6OcVV*ru4IP)X>UI#wJZ; z-H1lxG&8xzb!DKL1S9oqyPu}pkKG3T#zF5a7%2Vhdr|(7YbRRyPfhyqv!iUH9=nfR z%?BIf1g7y2iyykC4#g2Jx|d&?#ktG*&R^l9AEQxlIi8L9*>WGV00-Nmfp;AdisZGM z1uW?Cau$mC?Bb*O&W30RGZvje@qmoY8rZnDDSOD~+s2_`fjx6YX)0IubB{DTx!<}W`K~}HK_NxENE@6qT9eU%4 zJzVxJd#k@FBXnrrVPW}d=9p06p&D%qOBVM7&m^#!B+NZ5g%o4sc z6~z8HQ~l^i*aA+{R5PRm5v}os;Riq0JkE=IaY>*y?MQX<$v{(?AEt zWQOe+H5&J$SjoWXEabi{45JKwB1*MkUt$Of_Ut$?ry>kfK#Dc#SS2#)Jd2DHv+ez( z7tj6Y--)^xr#Nm2GY87_&O_NNjYEGX9~>SW%_pDEHqvaYid8S#`=0;Rm+gHq%?nQg z7@QBa4~}kzc$Gj=j;2-ImovzF$z%0pfS;-f+a!%Xg%tj^JBZBbCm+sfmNtgHBnMGqa--@HSD{LaIKP4D;8NVkcy%_(F zg^$pX^}s4Pb?XEBo>jM&E!V2s@8^=eYSkdsED0_4_B^!yfzGYa`utXC>3LTIC)<_D zKsBPNKxYm?!>Ge~h9$voIghS+Xt@i0pmCT-61;$zQ~ zfBwG&3S5ICL$u(^0u8`~C4zIqG9e*eQvuEbNg^$RBz+8(SzslyH<;5VzapGj&1uqQ z_GE4CW|*iHFKSp{Pt}=IGIa@E#Re^?UVwAD6&V8ifuto#P z0hR$XV$mHY$9x^eK24XMLWrMDO(oME8e2?33g|>$GSb9?;*&pLuvd8hFxhqr` z*sactJ~daS%T2l}&&=gUD!CD8XGX9S9&43zR`z!RISyW-5Erq@N>&ByxoTZh981j& zxa=*wa|m$i_Lzr-!e&$Yypr!K0>x*<10*cM#qTqn;6gs|yKb-OHk}@#Thm zP#MLgGQ;>*iJoN2??*`xN0%zh2k+5&AL zJirt@xya!UvN}V-_!GVQi4u#BUn1amZz=S6vtuaQO+MkF{u|oebP|V+BsC4dFKp;Z zWP+1eHQ3p+;=9pLvxcW$O`=SV;NjLd$h2y1AMEUXb9l6~e|*qB+J1x@lIXx^l`ks! zRUnDp&+^4uqBMt7j)z{JQF^B;t*UOE~D zN!Xg!k)BX3bKOn3Ih*5g-JY}W!p~8Ed^Rx5khd40ocA1_&qrMt;zM}?+PfI=ws;C3 o{|HClMfE1n@Gkuzr};ET$!C0Hff=aHdcx3}*Ho+3l2fw(2PW;ZaR2}S diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_dist_info.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_dist_info.py deleted file mode 100644 index a8adb68c2..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_dist_info.py +++ /dev/null @@ -1,83 +0,0 @@ -"""Test .dist-info style distributions. -""" -import os -import shutil -import tempfile -import unittest -import textwrap - -try: - import ast -except: - pass - -import pkg_resources - -from setuptools.tests.py26compat import skipIf - -def DALS(s): - "dedent and left-strip" - return textwrap.dedent(s).lstrip() - -class TestDistInfo(unittest.TestCase): - - def test_distinfo(self): - dists = {} - for d in pkg_resources.find_distributions(self.tmpdir): - dists[d.project_name] = d - - assert len(dists) == 2, dists - - unversioned = dists['UnversionedDistribution'] - versioned = dists['VersionedDistribution'] - - assert versioned.version == '2.718' # from filename - assert unversioned.version == '0.3' # from METADATA - - @skipIf('ast' not in globals(), - "ast is used to test conditional dependencies (Python >= 2.6)") - def test_conditional_dependencies(self): - requires = [pkg_resources.Requirement.parse('splort==4'), - pkg_resources.Requirement.parse('quux>=1.1')] - - for d in pkg_resources.find_distributions(self.tmpdir): - self.assertEqual(d.requires(), requires[:1]) - self.assertEqual(d.requires(extras=('baz',)), requires) - self.assertEqual(d.extras, ['baz']) - - def setUp(self): - self.tmpdir = tempfile.mkdtemp() - versioned = os.path.join(self.tmpdir, - 'VersionedDistribution-2.718.dist-info') - os.mkdir(versioned) - metadata_file = open(os.path.join(versioned, 'METADATA'), 'w+') - try: - metadata_file.write(DALS( - """ - Metadata-Version: 1.2 - Name: VersionedDistribution - Requires-Dist: splort (4) - Provides-Extra: baz - Requires-Dist: quux (>=1.1); extra == 'baz' - """)) - finally: - metadata_file.close() - unversioned = os.path.join(self.tmpdir, - 'UnversionedDistribution.dist-info') - os.mkdir(unversioned) - metadata_file = open(os.path.join(unversioned, 'METADATA'), 'w+') - try: - metadata_file.write(DALS( - """ - Metadata-Version: 1.2 - Name: UnversionedDistribution - Version: 0.3 - Requires-Dist: splort (==4) - Provides-Extra: baz - Requires-Dist: quux (>=1.1); extra == 'baz' - """)) - finally: - metadata_file.close() - - def tearDown(self): - shutil.rmtree(self.tmpdir) diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_dist_info.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_dist_info.pyc deleted file mode 100644 index 51f27cbed11bec9cb2c64879a4bf8f7c3cf385bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3740 zcmc&$QFGfw5WbUaCw7xGw3L!kKy;>42e79Jot6nrhmhoQ7LBryK|%Zi(-jdEg(`^NInjaL5)Hl-;>X4eZD_kXMfOrVYEsQ&fqs>vI9O`FbYhc18*7ZvGFFspU34K$dnfqaSztg5ZJr1} z0_LRXS!8sZC+bUh8K^+T#_{98iB!kb$VytJz?o?h>X|vr{FII4y4;L%J+@CmS0Mxo z-9sx_X?8=iH)u6?!+0&~WGXn(YK3ugL$wCo=A$FCm&BX#)8=yhPV+(7YUHLUHDiB1C8(c|@py3!4)Kyc9){XR<_@MD~ztce_f_=eQTqpuMc) z(Z4~2LL5u+?8Z0&6n!Z+e!3`*E%5?Bq{R|FTiiWZ5WDaM15f~(_AQ~egeeY3eug50 zb>Z0NmMs>Jp$<4d9cWXzYYiCWWLp{kV0fGLp+Y3s!Rha}IJacFUB} zf92%aL6ibS@a1q2Za>6;o`(>!Bp2j+)+bg)R;){s!{EcAyLg9xC)CbBtH3ddLn}D# zBo0CfjUPFIN>z;VZHG!b)x4CPd#lcJ{q`b5l443BVo3guMotBQAs_~zjk^rYuEl`u z@HlV=-as)BU|j|*`T!&VTcQ#nK-$7VjY!fQy#X3QZZ9zi6R*8PNfkvmA3eAub{UhD z+bvCb(rJWTudd$W-oaq-?B429eJNy)p(+CvWe5p5)$*S+g}D^SDiM`SOK|>Obub7s z)d!XsAE}>dr^`@07XGLmBVVxU*qGI)BkXDXKiC`XN`}K!!PvTm|bz+_&ij`4}9a-hU>04OZDXm ztu1ibigT*z3Ed%5b&cqE#mNi6soq+g(0r67Ps2dz+9uV&iUa&l=)AES6_8Wq5?cJm z;o5OlSDhP}dSha){tODGqdgA`ow%T^w>G z_}NBs7`x;W`6eVEQA{-+-*!CD(1GN6{UjJf%JW>hbkPLC_~}MT%a626vbQeIc?=^qrqO?&C_>}lB};ll;q6l RYuR!hz%N)c*1T0N{0HB;b= "2.6": - self.old_has_site = easy_install_pkg.HAS_USER_SITE - self.old_file = easy_install_pkg.__file__ - self.old_base = site.USER_BASE - site.USER_BASE = tempfile.mkdtemp() - self.old_site = site.USER_SITE - site.USER_SITE = tempfile.mkdtemp() - easy_install_pkg.__file__ = site.USER_SITE - - def tearDown(self): - os.chdir(self.old_cwd) - shutil.rmtree(self.dir) - if sys.version >= "2.6": - shutil.rmtree(site.USER_BASE) - shutil.rmtree(site.USER_SITE) - site.USER_BASE = self.old_base - site.USER_SITE = self.old_site - easy_install_pkg.HAS_USER_SITE = self.old_has_site - easy_install_pkg.__file__ = self.old_file - - def test_user_install_implied(self): - easy_install_pkg.HAS_USER_SITE = True # disabled sometimes - #XXX: replace with something meaningfull - if sys.version < "2.6": - return #SKIP - dist = Distribution() - dist.script_name = 'setup.py' - cmd = easy_install(dist) - cmd.args = ['py'] - cmd.ensure_finalized() - self.assertTrue(cmd.user, 'user should be implied') - - def test_multiproc_atexit(self): - if not _MULTIPROC: - return - _LOG.info('this should not break') - - def test_user_install_not_implied_without_usersite_enabled(self): - easy_install_pkg.HAS_USER_SITE = False # usually enabled - #XXX: replace with something meaningfull - if sys.version < "2.6": - return #SKIP - dist = Distribution() - dist.script_name = 'setup.py' - cmd = easy_install(dist) - cmd.args = ['py'] - cmd.initialize_options() - self.assertFalse(cmd.user, 'NOT user should be implied') - - def test_local_index(self): - # make sure the local index is used - # when easy_install looks for installed - # packages - new_location = tempfile.mkdtemp() - target = tempfile.mkdtemp() - egg_file = os.path.join(new_location, 'foo-1.0.egg-info') - f = open(egg_file, 'w') - try: - f.write('Name: foo\n') - finally: - f.close() - - sys.path.append(target) - old_ppath = os.environ.get('PYTHONPATH') - os.environ['PYTHONPATH'] = os.path.pathsep.join(sys.path) - try: - dist = Distribution() - dist.script_name = 'setup.py' - cmd = easy_install(dist) - cmd.install_dir = target - cmd.args = ['foo'] - cmd.ensure_finalized() - cmd.local_index.scan([new_location]) - res = cmd.easy_install('foo') - self.assertEqual(os.path.realpath(res.location), - os.path.realpath(new_location)) - finally: - sys.path.remove(target) - for basedir in [new_location, target, ]: - if not os.path.exists(basedir) or not os.path.isdir(basedir): - continue - try: - shutil.rmtree(basedir) - except: - pass - if old_ppath is not None: - os.environ['PYTHONPATH'] = old_ppath - else: - del os.environ['PYTHONPATH'] - - def test_setup_requires(self): - """Regression test for Distribute issue #318 - - Ensure that a package with setup_requires can be installed when - setuptools is installed in the user site-packages without causing a - SandboxViolation. - """ - - test_setup_attrs = { - 'name': 'test_pkg', 'version': '0.0', - 'setup_requires': ['foobar'], - 'dependency_links': [os.path.abspath(self.dir)] - } - - test_pkg = os.path.join(self.dir, 'test_pkg') - test_setup_py = os.path.join(test_pkg, 'setup.py') - test_setup_cfg = os.path.join(test_pkg, 'setup.cfg') - os.mkdir(test_pkg) - - f = open(test_setup_py, 'w') - f.write(textwrap.dedent("""\ - import setuptools - setuptools.setup(**%r) - """ % test_setup_attrs)) - f.close() - - foobar_path = os.path.join(self.dir, 'foobar-0.1.tar.gz') - make_trivial_sdist( - foobar_path, - textwrap.dedent("""\ - import setuptools - setuptools.setup( - name='foobar', - version='0.1' - ) - """)) - - old_stdout = sys.stdout - old_stderr = sys.stderr - sys.stdout = StringIO() - sys.stderr = StringIO() - try: - try: - reset_setup_stop_context( - lambda: run_setup(test_setup_py, ['install']) - ) - except SandboxViolation: - self.fail('Installation caused SandboxViolation') - finally: - sys.stdout = old_stdout - sys.stderr = old_stderr - - -class TestSetupRequires(unittest.TestCase): - - def test_setup_requires_honors_fetch_params(self): - """ - When easy_install installs a source distribution which specifies - setup_requires, it should honor the fetch parameters (such as - allow-hosts, index-url, and find-links). - """ - # set up a server which will simulate an alternate package index. - p_index = setuptools.tests.server.MockServer() - p_index.start() - netloc = 1 - p_index_loc = urlparse(p_index.url)[netloc] - if p_index_loc.endswith(':0'): - # Some platforms (Jython) don't find a port to which to bind, - # so skip this test for them. - return - - # I realize this is all-but-impossible to read, because it was - # ported from some well-factored, safe code using 'with'. If you - # need to maintain this code, consider making the changes in - # the parent revision (of this comment) and then port the changes - # back for Python 2.4 (or deprecate Python 2.4). - - def install(dist_file): - def install_at(temp_install_dir): - def install_env(): - ei_params = ['--index-url', p_index.url, - '--allow-hosts', p_index_loc, - '--exclude-scripts', '--install-dir', temp_install_dir, - dist_file] - def install_clean_reset(): - def install_clean_argv(): - # attempt to install the dist. It should fail because - # it doesn't exist. - self.assertRaises(SystemExit, - easy_install_pkg.main, ei_params) - argv_context(install_clean_argv, ['easy_install']) - reset_setup_stop_context(install_clean_reset) - environment_context(install_env, PYTHONPATH=temp_install_dir) - tempdir_context(install_at) - - # create an sdist that has a build-time dependency. - self.create_sdist(install) - - # there should have been two or three requests to the server - # (three happens on Python 3.3a) - self.assertTrue(2 <= len(p_index.requests) <= 3) - self.assertEqual(p_index.requests[0].path, '/does-not-exist/') - - def create_sdist(self, installer): - """ - Create an sdist with a setup_requires dependency (of something that - doesn't exist) and invoke installer on it. - """ - def build_sdist(dir): - dist_path = os.path.join(dir, 'setuptools-test-fetcher-1.0.tar.gz') - make_trivial_sdist( - dist_path, - textwrap.dedent(""" - import setuptools - setuptools.setup( - name="setuptools-test-fetcher", - version="1.0", - setup_requires = ['does-not-exist'], - ) - """).lstrip()) - installer(dist_path) - tempdir_context(build_sdist) - - -def make_trivial_sdist(dist_path, setup_py): - """Create a simple sdist tarball at dist_path, containing just a - setup.py, the contents of which are provided by the setup_py string. - """ - - setup_py_file = tarfile.TarInfo(name='setup.py') - try: - # Python 3 (StringIO gets converted to io module) - MemFile = BytesIO - except AttributeError: - MemFile = StringIO - setup_py_bytes = MemFile(setup_py.encode('utf-8')) - setup_py_file.size = len(setup_py_bytes.getvalue()) - dist = tarfile.open(dist_path, 'w:gz') - try: - dist.addfile(setup_py_file, fileobj=setup_py_bytes) - finally: - dist.close() - - -def tempdir_context(f, cd=lambda dir:None): - """ - Invoke f in the context - """ - temp_dir = tempfile.mkdtemp() - orig_dir = os.getcwd() - try: - cd(temp_dir) - f(temp_dir) - finally: - cd(orig_dir) - shutil.rmtree(temp_dir) - -def environment_context(f, **updates): - """ - Invoke f in the context - """ - old_env = os.environ.copy() - os.environ.update(updates) - try: - f() - finally: - for key in updates: - del os.environ[key] - os.environ.update(old_env) - -def argv_context(f, repl): - """ - Invoke f in the context - """ - old_argv = sys.argv[:] - sys.argv[:] = repl - try: - f() - finally: - sys.argv[:] = old_argv - -def reset_setup_stop_context(f): - """ - When the setuptools tests are run using setup.py test, and then - one wants to invoke another setup() command (such as easy_install) - within those tests, it's necessary to reset the global variable - in distutils.core so that the setup() command will run naturally. - """ - setup_stop_after = distutils.core._setup_stop_after - distutils.core._setup_stop_after = None - try: - f() - finally: - distutils.core._setup_stop_after = setup_stop_after diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_easy_install.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_easy_install.pyc deleted file mode 100644 index 5421d755b3fcc838ebd293a9f4104bc9775fbe6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18379 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 DIBz-? diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_markerlib.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_markerlib.py deleted file mode 100644 index dae71cba4..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_markerlib.py +++ /dev/null @@ -1,68 +0,0 @@ -import os -import unittest -from setuptools.tests.py26compat import skipIf - -try: - import ast -except ImportError: - pass - -class TestMarkerlib(unittest.TestCase): - - @skipIf('ast' not in globals(), - "ast not available (Python < 2.6?)") - def test_markers(self): - from _markerlib import interpret, default_environment, compile - - os_name = os.name - - self.assertTrue(interpret("")) - - self.assertTrue(interpret("os.name != 'buuuu'")) - self.assertTrue(interpret("os_name != 'buuuu'")) - self.assertTrue(interpret("python_version > '1.0'")) - self.assertTrue(interpret("python_version < '5.0'")) - self.assertTrue(interpret("python_version <= '5.0'")) - self.assertTrue(interpret("python_version >= '1.0'")) - self.assertTrue(interpret("'%s' in os.name" % os_name)) - self.assertTrue(interpret("'%s' in os_name" % os_name)) - self.assertTrue(interpret("'buuuu' not in os.name")) - - self.assertFalse(interpret("os.name == 'buuuu'")) - self.assertFalse(interpret("os_name == 'buuuu'")) - self.assertFalse(interpret("python_version < '1.0'")) - self.assertFalse(interpret("python_version > '5.0'")) - self.assertFalse(interpret("python_version >= '5.0'")) - self.assertFalse(interpret("python_version <= '1.0'")) - self.assertFalse(interpret("'%s' not in os.name" % os_name)) - self.assertFalse(interpret("'buuuu' in os.name and python_version >= '5.0'")) - self.assertFalse(interpret("'buuuu' in os_name and python_version >= '5.0'")) - - environment = default_environment() - environment['extra'] = 'test' - self.assertTrue(interpret("extra == 'test'", environment)) - self.assertFalse(interpret("extra == 'doc'", environment)) - - def raises_nameError(): - try: - interpret("python.version == '42'") - except NameError: - pass - else: - raise Exception("Expected NameError") - - raises_nameError() - - def raises_syntaxError(): - try: - interpret("(x for x in (4,))") - except SyntaxError: - pass - else: - raise Exception("Expected SyntaxError") - - raises_syntaxError() - - statement = "python_version == '5'" - self.assertEqual(compile(statement).__doc__, statement) - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_markerlib.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_markerlib.pyc deleted file mode 100644 index 246995796b0a5e12903dd60c36949b0531120a01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3044 zcmd5;TW{k;6h338xpaF;x4SLNE|U9z>`D+pw7VdbE!QHgfC}77yF`&JC!TcOI(G0( zs#Ho}Sj6R5@qc*b2f#VUxtO@!C$!+ilkqn*XU^rD&oTd8Up@H!kMDXgy;kt|6TDT3 zO@Lnk5kPz17tj`r8xR>VFrjUNxUA2nmY`jNXYm%417hXq>z^*Qn3+LhRX|5r@ zo#M>9a|ja+a8-g}2PW9=LTi!qHwZ#j%u11&yO%?M0Ve62@G}}&feF?GKupp5jFw@7 zWkED}09O^Raup^9Ot>;Yj z!Ze8oGS<3+crO_Y!$@lEg1U`Oq8hP3kk;N4%kGZwvZt`O4DaCVA+y-Kkf{oh%?FnK ze&an`T{G0O>_;@TTU^z`t!^4Sz%e$tiR#5^>`k-sX0o5m<~Hc2(&@JJ?dJ~s%@>X3siKMt(r+|RODSdvxl6-!V{P_R$| zHL0W=>(uAma?hfi(4eh0W}}P+Nzd*f!WS*17*rFR%MCusnHaHFBfm(i_gJgf;kibM z<^%F0Ykek}M>*a!W|X4cA2u@*9*&2yr)6LrAwv(-G)YM%K@;8Q5I-G`dvd6ek`4|5 zE52(|j~>+-Ho-@o(@?({bvw_(_|vGL${^S4hH>W$*&UsBGMzq*FFMV}2c56OZbyY$ zzB}}L=l-cw9VPW>sFNg89ZFKxdV|@kq=8kc<94YZDyg^<>^K!ktzrYh6dPh)l#G8l zms@Dt8C(4%wZ=pp=ixj1`|1v&^E4h`#@Zj}5_tge)GUg_lyHgsF7a0rnG(gPfy9ny`%1}FpQIzHDLdKYmwtqGUpycF zF!CeTQ_sU=;dxG#?2%<9qke7+(%dBD0k6;Lu}k(``ZK~5R@&E+bb6@(ubaJVHr%s9~d=b+t?P1&#u@N%LtAdHL)so#E!99t?*qI{D(|anmj%go|hHJ8zjLf zlAh<%7M#=5DCuIt-FpaR$)F+bz2;=N^f!$-q^PuIV^eUUU3w95ETcHoETs2o(p(xE zEDfjy&Bye@^)(0QvUpL|pALpes`((YnG?+S=f0A>-+vo2`_sybazNqpTVPGBiMnBm HIxE-T0AJFI diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_packageindex.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_packageindex.py deleted file mode 100644 index 08969b7e8..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_packageindex.py +++ /dev/null @@ -1,187 +0,0 @@ -"""Package Index Tests -""" -import sys -import unittest -import pkg_resources -from setuptools.compat import urllib2, httplib, HTTPError, unicode -import distutils.errors -import setuptools.package_index -from setuptools.tests.server import IndexServer - -class TestPackageIndex(unittest.TestCase): - - def test_bad_url_bad_port(self): - index = setuptools.package_index.PackageIndex() - url = 'http://127.0.0.1:0/nonesuch/test_package_index' - try: - v = index.open_url(url) - except Exception: - v = sys.exc_info()[1] - self.assertTrue(url in str(v)) - else: - self.assertTrue(isinstance(v, HTTPError)) - - def test_bad_url_typo(self): - # issue 16 - # easy_install inquant.contentmirror.plone breaks because of a typo - # in its home URL - index = setuptools.package_index.PackageIndex( - hosts=('www.example.com',) - ) - - url = 'url:%20https://svn.plone.org/svn/collective/inquant.contentmirror.plone/trunk' - try: - v = index.open_url(url) - except Exception: - v = sys.exc_info()[1] - self.assertTrue(url in str(v)) - else: - self.assertTrue(isinstance(v, HTTPError)) - - def test_bad_url_bad_status_line(self): - index = setuptools.package_index.PackageIndex( - hosts=('www.example.com',) - ) - - def _urlopen(*args): - raise httplib.BadStatusLine('line') - - index.opener = _urlopen - url = 'http://example.com' - try: - v = index.open_url(url) - except Exception: - v = sys.exc_info()[1] - self.assertTrue('line' in str(v)) - else: - raise AssertionError('Should have raise here!') - - def test_bad_url_double_scheme(self): - """ - A bad URL with a double scheme should raise a DistutilsError. - """ - index = setuptools.package_index.PackageIndex( - hosts=('www.example.com',) - ) - - # issue 20 - url = 'http://http://svn.pythonpaste.org/Paste/wphp/trunk' - try: - index.open_url(url) - except distutils.errors.DistutilsError: - error = sys.exc_info()[1] - msg = unicode(error) - assert 'nonnumeric port' in msg or 'getaddrinfo failed' in msg or 'Name or service not known' in msg - return - raise RuntimeError("Did not raise") - - def test_bad_url_screwy_href(self): - index = setuptools.package_index.PackageIndex( - hosts=('www.example.com',) - ) - - # issue #160 - if sys.version_info[0] == 2 and sys.version_info[1] == 7: - # this should not fail - url = 'http://example.com' - page = ('') - index.process_index(url, page) - - def test_url_ok(self): - index = setuptools.package_index.PackageIndex( - hosts=('www.example.com',) - ) - url = 'file:///tmp/test_package_index' - self.assertTrue(index.url_ok(url, True)) - - def test_links_priority(self): - """ - Download links from the pypi simple index should be used before - external download links. - https://bitbucket.org/tarek/distribute/issue/163 - - Usecase : - - someone uploads a package on pypi, a md5 is generated - - someone manually copies this link (with the md5 in the url) onto an - external page accessible from the package page. - - someone reuploads the package (with a different md5) - - while easy_installing, an MD5 error occurs because the external link - is used - -> Setuptools should use the link from pypi, not the external one. - """ - if sys.platform.startswith('java'): - # Skip this test on jython because binding to :0 fails - return - - # start an index server - server = IndexServer() - server.start() - index_url = server.base_url() + 'test_links_priority/simple/' - - # scan a test index - pi = setuptools.package_index.PackageIndex(index_url) - requirement = pkg_resources.Requirement.parse('foobar') - pi.find_packages(requirement) - server.stop() - - # the distribution has been found - self.assertTrue('foobar' in pi) - # we have only one link, because links are compared without md5 - self.assertTrue(len(pi['foobar'])==1) - # the link should be from the index - self.assertTrue('correct_md5' in pi['foobar'][0].location) - - def test_parse_bdist_wininst(self): - self.assertEqual(setuptools.package_index.parse_bdist_wininst( - 'reportlab-2.5.win32-py2.4.exe'), ('reportlab-2.5', '2.4', 'win32')) - self.assertEqual(setuptools.package_index.parse_bdist_wininst( - 'reportlab-2.5.win32.exe'), ('reportlab-2.5', None, 'win32')) - self.assertEqual(setuptools.package_index.parse_bdist_wininst( - 'reportlab-2.5.win-amd64-py2.7.exe'), ('reportlab-2.5', '2.7', 'win-amd64')) - self.assertEqual(setuptools.package_index.parse_bdist_wininst( - 'reportlab-2.5.win-amd64.exe'), ('reportlab-2.5', None, 'win-amd64')) - - def test__vcs_split_rev_from_url(self): - """ - Test the basic usage of _vcs_split_rev_from_url - """ - vsrfu = setuptools.package_index.PackageIndex._vcs_split_rev_from_url - url, rev = vsrfu('https://example.com/bar@2995') - self.assertEqual(url, 'https://example.com/bar') - self.assertEqual(rev, '2995') - -class TestContentCheckers(unittest.TestCase): - - def test_md5(self): - checker = setuptools.package_index.HashChecker.from_url( - 'http://foo/bar#md5=f12895fdffbd45007040d2e44df98478') - checker.feed('You should probably not be using MD5'.encode('ascii')) - self.assertEqual(checker.hash.hexdigest(), - 'f12895fdffbd45007040d2e44df98478') - self.assertTrue(checker.is_valid()) - - def test_other_fragment(self): - "Content checks should succeed silently if no hash is present" - checker = setuptools.package_index.HashChecker.from_url( - 'http://foo/bar#something%20completely%20different') - checker.feed('anything'.encode('ascii')) - self.assertTrue(checker.is_valid()) - - def test_blank_md5(self): - "Content checks should succeed if a hash is empty" - checker = setuptools.package_index.HashChecker.from_url( - 'http://foo/bar#md5=') - checker.feed('anything'.encode('ascii')) - self.assertTrue(checker.is_valid()) - - def test_get_hash_name_md5(self): - checker = setuptools.package_index.HashChecker.from_url( - 'http://foo/bar#md5=f12895fdffbd45007040d2e44df98478') - self.assertEqual(checker.hash_name, 'md5') - - def test_report(self): - checker = setuptools.package_index.HashChecker.from_url( - 'http://foo/bar#md5=f12895fdffbd45007040d2e44df98478') - rep = checker.report(lambda x: x, 'My message about %s') - self.assertEqual(rep, 'My message about md5') diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_packageindex.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_packageindex.pyc deleted file mode 100644 index 5410624f55704e5b438d843dce2b468a7c553c47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10016 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 N@!!kRE|kvx?!VQNoudE% diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_resources.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_resources.py deleted file mode 100644 index df5261d1f..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_resources.py +++ /dev/null @@ -1,615 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# NOTE: the shebang and encoding lines are for ScriptHeaderTests; do not remove -from unittest import TestCase, makeSuite; from pkg_resources import * -from setuptools.command.easy_install import get_script_header, is_sh -from setuptools.compat import StringIO, iteritems -import os, pkg_resources, sys, tempfile, shutil -try: frozenset -except NameError: - from sets import ImmutableSet as frozenset - -def safe_repr(obj, short=False): - """ copied from Python2.7""" - try: - result = repr(obj) - except Exception: - result = object.__repr__(obj) - if not short or len(result) < _MAX_LENGTH: - return result - return result[:_MAX_LENGTH] + ' [truncated]...' - -class Metadata(EmptyProvider): - """Mock object to return metadata as if from an on-disk distribution""" - - def __init__(self,*pairs): - self.metadata = dict(pairs) - - def has_metadata(self,name): - return name in self.metadata - - def get_metadata(self,name): - return self.metadata[name] - - def get_metadata_lines(self,name): - return yield_lines(self.get_metadata(name)) - -class DistroTests(TestCase): - - def testCollection(self): - # empty path should produce no distributions - ad = Environment([], platform=None, python=None) - self.assertEqual(list(ad), []) - self.assertEqual(ad['FooPkg'],[]) - ad.add(Distribution.from_filename("FooPkg-1.3_1.egg")) - ad.add(Distribution.from_filename("FooPkg-1.4-py2.4-win32.egg")) - ad.add(Distribution.from_filename("FooPkg-1.2-py2.4.egg")) - - # Name is in there now - self.assertTrue(ad['FooPkg']) - # But only 1 package - self.assertEqual(list(ad), ['foopkg']) - - # Distributions sort by version - self.assertEqual( - [dist.version for dist in ad['FooPkg']], ['1.4','1.3-1','1.2'] - ) - # Removing a distribution leaves sequence alone - ad.remove(ad['FooPkg'][1]) - self.assertEqual( - [dist.version for dist in ad['FooPkg']], ['1.4','1.2'] - ) - # And inserting adds them in order - ad.add(Distribution.from_filename("FooPkg-1.9.egg")) - self.assertEqual( - [dist.version for dist in ad['FooPkg']], ['1.9','1.4','1.2'] - ) - - ws = WorkingSet([]) - foo12 = Distribution.from_filename("FooPkg-1.2-py2.4.egg") - foo14 = Distribution.from_filename("FooPkg-1.4-py2.4-win32.egg") - req, = parse_requirements("FooPkg>=1.3") - - # Nominal case: no distros on path, should yield all applicable - self.assertEqual(ad.best_match(req,ws).version, '1.9') - # If a matching distro is already installed, should return only that - ws.add(foo14); self.assertEqual(ad.best_match(req,ws).version, '1.4') - - # If the first matching distro is unsuitable, it's a version conflict - ws = WorkingSet([]); ws.add(foo12); ws.add(foo14) - self.assertRaises(VersionConflict, ad.best_match, req, ws) - - # If more than one match on the path, the first one takes precedence - ws = WorkingSet([]); ws.add(foo14); ws.add(foo12); ws.add(foo14); - self.assertEqual(ad.best_match(req,ws).version, '1.4') - - def checkFooPkg(self,d): - self.assertEqual(d.project_name, "FooPkg") - self.assertEqual(d.key, "foopkg") - self.assertEqual(d.version, "1.3-1") - self.assertEqual(d.py_version, "2.4") - self.assertEqual(d.platform, "win32") - self.assertEqual(d.parsed_version, parse_version("1.3-1")) - - def testDistroBasics(self): - d = Distribution( - "/some/path", - project_name="FooPkg",version="1.3-1",py_version="2.4",platform="win32" - ) - self.checkFooPkg(d) - - d = Distribution("/some/path") - self.assertEqual(d.py_version, sys.version[:3]) - self.assertEqual(d.platform, None) - - def testDistroParse(self): - d = Distribution.from_filename("FooPkg-1.3_1-py2.4-win32.egg") - self.checkFooPkg(d) - d = Distribution.from_filename("FooPkg-1.3_1-py2.4-win32.egg-info") - self.checkFooPkg(d) - - def testDistroMetadata(self): - d = Distribution( - "/some/path", project_name="FooPkg", py_version="2.4", platform="win32", - metadata = Metadata( - ('PKG-INFO',"Metadata-Version: 1.0\nVersion: 1.3-1\n") - ) - ) - self.checkFooPkg(d) - - - def distRequires(self, txt): - return Distribution("/foo", metadata=Metadata(('depends.txt', txt))) - - def checkRequires(self, dist, txt, extras=()): - self.assertEqual( - list(dist.requires(extras)), - list(parse_requirements(txt)) - ) - - def testDistroDependsSimple(self): - for v in "Twisted>=1.5", "Twisted>=1.5\nZConfig>=2.0": - self.checkRequires(self.distRequires(v), v) - - - def testResolve(self): - ad = Environment([]); ws = WorkingSet([]) - # Resolving no requirements -> nothing to install - self.assertEqual( list(ws.resolve([],ad)), [] ) - # Request something not in the collection -> DistributionNotFound - self.assertRaises( - DistributionNotFound, ws.resolve, parse_requirements("Foo"), ad - ) - Foo = Distribution.from_filename( - "/foo_dir/Foo-1.2.egg", - metadata=Metadata(('depends.txt', "[bar]\nBaz>=2.0")) - ) - ad.add(Foo); ad.add(Distribution.from_filename("Foo-0.9.egg")) - - # Request thing(s) that are available -> list to activate - for i in range(3): - targets = list(ws.resolve(parse_requirements("Foo"), ad)) - self.assertEqual(targets, [Foo]) - list(map(ws.add,targets)) - self.assertRaises(VersionConflict, ws.resolve, - parse_requirements("Foo==0.9"), ad) - ws = WorkingSet([]) # reset - - # Request an extra that causes an unresolved dependency for "Baz" - self.assertRaises( - DistributionNotFound, ws.resolve,parse_requirements("Foo[bar]"), ad - ) - Baz = Distribution.from_filename( - "/foo_dir/Baz-2.1.egg", metadata=Metadata(('depends.txt', "Foo")) - ) - ad.add(Baz) - - # Activation list now includes resolved dependency - self.assertEqual( - list(ws.resolve(parse_requirements("Foo[bar]"), ad)), [Foo,Baz] - ) - # Requests for conflicting versions produce VersionConflict - self.assertRaises( VersionConflict, - ws.resolve, parse_requirements("Foo==1.2\nFoo!=1.2"), ad - ) - - def testDistroDependsOptions(self): - d = self.distRequires(""" - Twisted>=1.5 - [docgen] - ZConfig>=2.0 - docutils>=0.3 - [fastcgi] - fcgiapp>=0.1""") - self.checkRequires(d,"Twisted>=1.5") - self.checkRequires( - d,"Twisted>=1.5 ZConfig>=2.0 docutils>=0.3".split(), ["docgen"] - ) - self.checkRequires( - d,"Twisted>=1.5 fcgiapp>=0.1".split(), ["fastcgi"] - ) - self.checkRequires( - d,"Twisted>=1.5 ZConfig>=2.0 docutils>=0.3 fcgiapp>=0.1".split(), - ["docgen","fastcgi"] - ) - self.checkRequires( - d,"Twisted>=1.5 fcgiapp>=0.1 ZConfig>=2.0 docutils>=0.3".split(), - ["fastcgi", "docgen"] - ) - self.assertRaises(UnknownExtra, d.requires, ["foo"]) - - -class EntryPointTests(TestCase): - - def assertfields(self, ep): - self.assertEqual(ep.name,"foo") - self.assertEqual(ep.module_name,"setuptools.tests.test_resources") - self.assertEqual(ep.attrs, ("EntryPointTests",)) - self.assertEqual(ep.extras, ("x",)) - self.assertTrue(ep.load() is EntryPointTests) - self.assertEqual( - str(ep), - "foo = setuptools.tests.test_resources:EntryPointTests [x]" - ) - - def setUp(self): - self.dist = Distribution.from_filename( - "FooPkg-1.2-py2.4.egg", metadata=Metadata(('requires.txt','[x]'))) - - def testBasics(self): - ep = EntryPoint( - "foo", "setuptools.tests.test_resources", ["EntryPointTests"], - ["x"], self.dist - ) - self.assertfields(ep) - - def testParse(self): - s = "foo = setuptools.tests.test_resources:EntryPointTests [x]" - ep = EntryPoint.parse(s, self.dist) - self.assertfields(ep) - - ep = EntryPoint.parse("bar baz= spammity[PING]") - self.assertEqual(ep.name,"bar baz") - self.assertEqual(ep.module_name,"spammity") - self.assertEqual(ep.attrs, ()) - self.assertEqual(ep.extras, ("ping",)) - - ep = EntryPoint.parse(" fizzly = wocka:foo") - self.assertEqual(ep.name,"fizzly") - self.assertEqual(ep.module_name,"wocka") - self.assertEqual(ep.attrs, ("foo",)) - self.assertEqual(ep.extras, ()) - - def testRejects(self): - for ep in [ - "foo", "x=1=2", "x=a:b:c", "q=x/na", "fez=pish:tush-z", "x=f[a]>2", - ]: - try: EntryPoint.parse(ep) - except ValueError: pass - else: raise AssertionError("Should've been bad", ep) - - def checkSubMap(self, m): - self.assertEqual(len(m), len(self.submap_expect)) - for key, ep in iteritems(self.submap_expect): - self.assertEqual(repr(m.get(key)), repr(ep)) - - submap_expect = dict( - feature1=EntryPoint('feature1', 'somemodule', ['somefunction']), - feature2=EntryPoint('feature2', 'another.module', ['SomeClass'], ['extra1','extra2']), - feature3=EntryPoint('feature3', 'this.module', extras=['something']) - ) - submap_str = """ - # define features for blah blah - feature1 = somemodule:somefunction - feature2 = another.module:SomeClass [extra1,extra2] - feature3 = this.module [something] - """ - - def testParseList(self): - self.checkSubMap(EntryPoint.parse_group("xyz", self.submap_str)) - self.assertRaises(ValueError, EntryPoint.parse_group, "x a", "foo=bar") - self.assertRaises(ValueError, EntryPoint.parse_group, "x", - ["foo=baz", "foo=bar"]) - - def testParseMap(self): - m = EntryPoint.parse_map({'xyz':self.submap_str}) - self.checkSubMap(m['xyz']) - self.assertEqual(list(m.keys()),['xyz']) - m = EntryPoint.parse_map("[xyz]\n"+self.submap_str) - self.checkSubMap(m['xyz']) - self.assertEqual(list(m.keys()),['xyz']) - self.assertRaises(ValueError, EntryPoint.parse_map, ["[xyz]", "[xyz]"]) - self.assertRaises(ValueError, EntryPoint.parse_map, self.submap_str) - -class RequirementsTests(TestCase): - - def testBasics(self): - r = Requirement.parse("Twisted>=1.2") - self.assertEqual(str(r),"Twisted>=1.2") - self.assertEqual(repr(r),"Requirement.parse('Twisted>=1.2')") - self.assertEqual(r, Requirement("Twisted", [('>=','1.2')], ())) - self.assertEqual(r, Requirement("twisTed", [('>=','1.2')], ())) - self.assertNotEqual(r, Requirement("Twisted", [('>=','2.0')], ())) - self.assertNotEqual(r, Requirement("Zope", [('>=','1.2')], ())) - self.assertNotEqual(r, Requirement("Zope", [('>=','3.0')], ())) - self.assertNotEqual(r, Requirement.parse("Twisted[extras]>=1.2")) - - def testOrdering(self): - r1 = Requirement("Twisted", [('==','1.2c1'),('>=','1.2')], ()) - r2 = Requirement("Twisted", [('>=','1.2'),('==','1.2c1')], ()) - self.assertEqual(r1,r2) - self.assertEqual(str(r1),str(r2)) - self.assertEqual(str(r2),"Twisted==1.2c1,>=1.2") - - def testBasicContains(self): - r = Requirement("Twisted", [('>=','1.2')], ()) - foo_dist = Distribution.from_filename("FooPkg-1.3_1.egg") - twist11 = Distribution.from_filename("Twisted-1.1.egg") - twist12 = Distribution.from_filename("Twisted-1.2.egg") - self.assertTrue(parse_version('1.2') in r) - self.assertTrue(parse_version('1.1') not in r) - self.assertTrue('1.2' in r) - self.assertTrue('1.1' not in r) - self.assertTrue(foo_dist not in r) - self.assertTrue(twist11 not in r) - self.assertTrue(twist12 in r) - - def testAdvancedContains(self): - r, = parse_requirements("Foo>=1.2,<=1.3,==1.9,>2.0,!=2.5,<3.0,==4.5") - for v in ('1.2','1.2.2','1.3','1.9','2.0.1','2.3','2.6','3.0c1','4.5'): - self.assertTrue(v in r, (v,r)) - for v in ('1.2c1','1.3.1','1.5','1.9.1','2.0','2.5','3.0','4.0'): - self.assertTrue(v not in r, (v,r)) - - - def testOptionsAndHashing(self): - r1 = Requirement.parse("Twisted[foo,bar]>=1.2") - r2 = Requirement.parse("Twisted[bar,FOO]>=1.2") - r3 = Requirement.parse("Twisted[BAR,FOO]>=1.2.0") - self.assertEqual(r1,r2) - self.assertEqual(r1,r3) - self.assertEqual(r1.extras, ("foo","bar")) - self.assertEqual(r2.extras, ("bar","foo")) # extras are normalized - self.assertEqual(hash(r1), hash(r2)) - self.assertEqual( - hash(r1), hash(("twisted", ((">=",parse_version("1.2")),), - frozenset(["foo","bar"]))) - ) - - def testVersionEquality(self): - r1 = Requirement.parse("foo==0.3a2") - r2 = Requirement.parse("foo!=0.3a4") - d = Distribution.from_filename - - self.assertTrue(d("foo-0.3a4.egg") not in r1) - self.assertTrue(d("foo-0.3a1.egg") not in r1) - self.assertTrue(d("foo-0.3a4.egg") not in r2) - - self.assertTrue(d("foo-0.3a2.egg") in r1) - self.assertTrue(d("foo-0.3a2.egg") in r2) - self.assertTrue(d("foo-0.3a3.egg") in r2) - self.assertTrue(d("foo-0.3a5.egg") in r2) - - def testSetuptoolsProjectName(self): - """ - The setuptools project should implement the setuptools package. - """ - - self.assertEqual( - Requirement.parse('setuptools').project_name, 'setuptools') - # setuptools 0.7 and higher means setuptools. - self.assertEqual( - Requirement.parse('setuptools == 0.7').project_name, 'setuptools') - self.assertEqual( - Requirement.parse('setuptools == 0.7a1').project_name, 'setuptools') - self.assertEqual( - Requirement.parse('setuptools >= 0.7').project_name, 'setuptools') - - - - - - - - - - - -class ParseTests(TestCase): - - def testEmptyParse(self): - self.assertEqual(list(parse_requirements('')), []) - - def testYielding(self): - for inp,out in [ - ([], []), ('x',['x']), ([[]],[]), (' x\n y', ['x','y']), - (['x\n\n','y'], ['x','y']), - ]: - self.assertEqual(list(pkg_resources.yield_lines(inp)),out) - - def testSplitting(self): - self.assertEqual( - list( - pkg_resources.split_sections(""" - x - [Y] - z - - a - [b ] - # foo - c - [ d] - [q] - v - """ - ) - ), - [(None,["x"]), ("Y",["z","a"]), ("b",["c"]), ("d",[]), ("q",["v"])] - ) - self.assertRaises(ValueError,list,pkg_resources.split_sections("[foo")) - - def testSafeName(self): - self.assertEqual(safe_name("adns-python"), "adns-python") - self.assertEqual(safe_name("WSGI Utils"), "WSGI-Utils") - self.assertEqual(safe_name("WSGI Utils"), "WSGI-Utils") - self.assertEqual(safe_name("Money$$$Maker"), "Money-Maker") - self.assertNotEqual(safe_name("peak.web"), "peak-web") - - def testSafeVersion(self): - self.assertEqual(safe_version("1.2-1"), "1.2-1") - self.assertEqual(safe_version("1.2 alpha"), "1.2.alpha") - self.assertEqual(safe_version("2.3.4 20050521"), "2.3.4.20050521") - self.assertEqual(safe_version("Money$$$Maker"), "Money-Maker") - self.assertEqual(safe_version("peak.web"), "peak.web") - - def testSimpleRequirements(self): - self.assertEqual( - list(parse_requirements('Twis-Ted>=1.2-1')), - [Requirement('Twis-Ted',[('>=','1.2-1')], ())] - ) - self.assertEqual( - list(parse_requirements('Twisted >=1.2, \ # more\n<2.0')), - [Requirement('Twisted',[('>=','1.2'),('<','2.0')], ())] - ) - self.assertEqual( - Requirement.parse("FooBar==1.99a3"), - Requirement("FooBar", [('==','1.99a3')], ()) - ) - self.assertRaises(ValueError,Requirement.parse,">=2.3") - self.assertRaises(ValueError,Requirement.parse,"x\\") - self.assertRaises(ValueError,Requirement.parse,"x==2 q") - self.assertRaises(ValueError,Requirement.parse,"X==1\nY==2") - self.assertRaises(ValueError,Requirement.parse,"#") - - def testVersionEquality(self): - def c(s1,s2): - p1, p2 = parse_version(s1),parse_version(s2) - self.assertEqual(p1,p2, (s1,s2,p1,p2)) - - c('1.2-rc1', '1.2rc1') - c('0.4', '0.4.0') - c('0.4.0.0', '0.4.0') - c('0.4.0-0', '0.4-0') - c('0pl1', '0.0pl1') - c('0pre1', '0.0c1') - c('0.0.0preview1', '0c1') - c('0.0c1', '0-rc1') - c('1.2a1', '1.2.a.1'); c('1.2...a', '1.2a') - - def testVersionOrdering(self): - def c(s1,s2): - p1, p2 = parse_version(s1),parse_version(s2) - self.assertTrue(p1= (3,) and os.environ.get("LC_CTYPE") - in (None, "C", "POSIX")): - return - - class java: - class lang: - class System: - @staticmethod - def getProperty(property): - return "" - sys.modules["java"] = java - - platform = sys.platform - sys.platform = 'java1.5.0_13' - stdout, stderr = sys.stdout, sys.stderr - try: - # A mock sys.executable that uses a shebang line (this file) - exe = os.path.normpath(os.path.splitext(__file__)[0] + '.py') - self.assertEqual( - get_script_header('#!/usr/local/bin/python', executable=exe), - '#!/usr/bin/env %s\n' % exe) - - # Ensure we generate what is basically a broken shebang line - # when there's options, with a warning emitted - sys.stdout = sys.stderr = StringIO() - self.assertEqual(get_script_header('#!/usr/bin/python -x', - executable=exe), - '#!%s -x\n' % exe) - self.assertTrue('Unable to adapt shebang line' in sys.stdout.getvalue()) - sys.stdout = sys.stderr = StringIO() - self.assertEqual(get_script_header('#!/usr/bin/python', - executable=self.non_ascii_exe), - '#!%s -x\n' % self.non_ascii_exe) - self.assertTrue('Unable to adapt shebang line' in sys.stdout.getvalue()) - finally: - del sys.modules["java"] - sys.platform = platform - sys.stdout, sys.stderr = stdout, stderr - - - - -class NamespaceTests(TestCase): - - def setUp(self): - self._ns_pkgs = pkg_resources._namespace_packages.copy() - self._tmpdir = tempfile.mkdtemp(prefix="tests-setuptools-") - os.makedirs(os.path.join(self._tmpdir, "site-pkgs")) - self._prev_sys_path = sys.path[:] - sys.path.append(os.path.join(self._tmpdir, "site-pkgs")) - - def tearDown(self): - shutil.rmtree(self._tmpdir) - pkg_resources._namespace_packages = self._ns_pkgs.copy() - sys.path = self._prev_sys_path[:] - - def _assertIn(self, member, container): - """ assertIn and assertTrue does not exist in Python2.3""" - if member not in container: - standardMsg = '%s not found in %s' % (safe_repr(member), - safe_repr(container)) - self.fail(self._formatMessage(msg, standardMsg)) - - def test_two_levels_deep(self): - """ - Test nested namespace packages - Create namespace packages in the following tree : - site-packages-1/pkg1/pkg2 - site-packages-2/pkg1/pkg2 - Check both are in the _namespace_packages dict and that their __path__ - is correct - """ - sys.path.append(os.path.join(self._tmpdir, "site-pkgs2")) - os.makedirs(os.path.join(self._tmpdir, "site-pkgs", "pkg1", "pkg2")) - os.makedirs(os.path.join(self._tmpdir, "site-pkgs2", "pkg1", "pkg2")) - ns_str = "__import__('pkg_resources').declare_namespace(__name__)\n" - for site in ["site-pkgs", "site-pkgs2"]: - pkg1_init = open(os.path.join(self._tmpdir, site, - "pkg1", "__init__.py"), "w") - pkg1_init.write(ns_str) - pkg1_init.close() - pkg2_init = open(os.path.join(self._tmpdir, site, - "pkg1", "pkg2", "__init__.py"), "w") - pkg2_init.write(ns_str) - pkg2_init.close() - import pkg1 - self._assertIn("pkg1", pkg_resources._namespace_packages.keys()) - try: - import pkg1.pkg2 - except ImportError: - self.fail("Setuptools tried to import the parent namespace package") - # check the _namespace_packages dict - self._assertIn("pkg1.pkg2", pkg_resources._namespace_packages.keys()) - self.assertEqual(pkg_resources._namespace_packages["pkg1"], ["pkg1.pkg2"]) - # check the __path__ attribute contains both paths - self.assertEqual(pkg1.pkg2.__path__, [ - os.path.join(self._tmpdir, "site-pkgs", "pkg1", "pkg2"), - os.path.join(self._tmpdir, "site-pkgs2", "pkg1", "pkg2") ]) - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_resources.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_resources.pyc deleted file mode 100644 index 83fdaac48d9c8c18fcd22a44a6df874b6d928878..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29508 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 diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sandbox.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sandbox.py deleted file mode 100644 index 1609ee861..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sandbox.py +++ /dev/null @@ -1,66 +0,0 @@ -"""develop tests -""" -import sys -import os -import shutil -import unittest -import tempfile - -from setuptools.sandbox import DirectorySandbox, SandboxViolation - -def has_win32com(): - """ - Run this to determine if the local machine has win32com, and if it - does, include additional tests. - """ - if not sys.platform.startswith('win32'): - return False - try: - mod = __import__('win32com') - except ImportError: - return False - return True - -class TestSandbox(unittest.TestCase): - - def setUp(self): - self.dir = tempfile.mkdtemp() - - def tearDown(self): - shutil.rmtree(self.dir) - - def test_devnull(self): - if sys.version < '2.4': - return - sandbox = DirectorySandbox(self.dir) - sandbox.run(self._file_writer(os.devnull)) - - def _file_writer(path): - def do_write(): - f = open(path, 'w') - f.write('xxx') - f.close() - return do_write - - _file_writer = staticmethod(_file_writer) - - if has_win32com(): - def test_win32com(self): - """ - win32com should not be prevented from caching COM interfaces - in gen_py. - """ - import win32com - gen_py = win32com.__gen_path__ - target = os.path.join(gen_py, 'test_write') - sandbox = DirectorySandbox(self.dir) - try: - try: - sandbox.run(self._file_writer(target)) - except SandboxViolation: - self.fail("Could not create gen_py file due to SandboxViolation") - finally: - if os.path.exists(target): os.remove(target) - -if __name__ == '__main__': - unittest.main() diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sandbox.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sandbox.pyc deleted file mode 100644 index 20bd491279d88f1a0a1c90edb6a77b0426955872..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3411 zcmc&$TW{P%6h33`CA;0wlF~xUMV3IYpf*CK5>kaIkQNC+Q*a6?tCcLTJ)3pnn>^zr zi_)he;GGAac;UD45BLG_ontR4HOC zcJRSo!gMdGbYzQaxfAB`tT+~COMjOXX=sxo7tIw`cQLjw%w0^DXkXF3DEU;8xk}ch zo#iF6(9a>To)GQk8`QB~Iv7%Qhm=yh=CSQTLYEIJF%3ODew}-Ekr>YwUaYOIvLx4D zG6z$8X%U5~mxa-SnTybPM@jy{t*FRuc#xZyC034!3vF(ANgkzjti3Rf6IKA5Mg2`# z196Dt0LxZd9X0Ob1>!-frI9Zs)SnksW{1qQVP(xxVi&Ui^Ds49J_JFMl|^NPz+S+* zFXZKZRe{yP`=hGXV>X@~ofYvIG|6NZpyE5zJseukrn^c0X*#cT{0ucq^65Q2tM{f~ zFYThp@8^fpTbmzFze;9PlURMT45Nc^Pn#*EsY_cFshNtdG6$w{>t?yMBU}d41uK17 zSV0JNH&jQt>XKSlT_s990$5rUi1V?O7&D*oo(GsTun9bpfK(vBXa&d};Q#@y5CCtF zbeGWpsOvsswEB|b2Hk4}xcWO|c1XlF;=%W9VVKL98jxYr2~mK12*BY*+X5f)lGRx` zPf~5!f7wCI?_%pXsT#wx8;nlp=Vf_T5AON4yv_vcN9zCTz65roE_6j$!DQ-reS3Vs zqP9tj5P~H$TWRfcAd9B{i%emh2fo&Dt<_<5uQPsY7;(i+whUMHg8L^^V!RSfkRyx1ig=U659wGsydet z2pB8DQH9{Ca3xV;WEb*eUZ<&~MzN!C+xR&zn{v!@GzYD89^MTbn$$(a?8OE~ti{U0 z5;Z@QR0~Bv5j_!8?ucI7k!;1pmgD#`?_mP!evumX)Zv`XUXU8b2yC&43k8e3Z`*PN z9*I?tkB^&3Wa}5D&YR@Q))gvB3)7}Q-ZVcA$TGAGG3(i8K{j4oH2!}FwBa~nYpyGi zrt$xq;Q4Q1YIrQV&%860)qe#yzRkC?aUo+zk_KlJ9$OgZ4@_;tv2rzh_rxJU8==Gz zgsh2}f@fWVOW2=139%0SaF>?X=>*+HU-)ZuBGJcw-_74Z;T}lgKIFp98;6{@`D?D| z@h)tLb zRgrm-l>I$#>)`_wc0}zwjI{aBK}qiI={zWxO@VJt_q?Xrks>WYBtdU(v+e%9FRFBC zb-Uf;+~CEv<}T#BUv#I z+YGLc6SQSbGS^vgsHGN4{%Njacs9DpA~Yd;+WN18+dvb<*`m_285(o8J=ps!!c`We zJ5mF61;OOvcO4;h#o3_ofH!d51wkHW8hsM?Q$c`Us75Ld{0+SNS9p4jCpMLs7%i7g zqD-UliG5Cm{!L7$dJA>7A<4?Ke9}1eoPmp9Z_pn(1J$aSg-IR+V{W~rf&@WaL{O4r zxWS3^HEfSMPb^!~m&I&_(_U=gi1LjOGNdN!< diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sdist.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sdist.py deleted file mode 100644 index 438f7cedb..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sdist.py +++ /dev/null @@ -1,400 +0,0 @@ -# -*- coding: utf-8 -*- -"""sdist tests""" - - -import os -import shutil -import sys -import tempfile -import unittest -import unicodedata - -from setuptools.compat import StringIO, unicode -from setuptools.command.sdist import sdist -from setuptools.command.egg_info import manifest_maker -from setuptools.dist import Distribution - - -SETUP_ATTRS = { - 'name': 'sdist_test', - 'version': '0.0', - 'packages': ['sdist_test'], - 'package_data': {'sdist_test': ['*.txt']} -} - - -SETUP_PY = """\ -from setuptools import setup - -setup(**%r) -""" % SETUP_ATTRS - - -if sys.version_info >= (3,): - LATIN1_FILENAME = 'smörbröd.py'.encode('latin-1') -else: - LATIN1_FILENAME = 'sm\xf6rbr\xf6d.py' - - -# Cannot use context manager because of Python 2.4 -def quiet(): - global old_stdout, old_stderr - old_stdout, old_stderr = sys.stdout, sys.stderr - sys.stdout, sys.stderr = StringIO(), StringIO() - -def unquiet(): - sys.stdout, sys.stderr = old_stdout, old_stderr - - -# Fake byte literals for Python <= 2.5 -def b(s, encoding='utf-8'): - if sys.version_info >= (3,): - return s.encode(encoding) - return s - - -# Convert to POSIX path -def posix(path): - if sys.version_info >= (3,) and not isinstance(path, str): - return path.replace(os.sep.encode('ascii'), b('/')) - else: - return path.replace(os.sep, '/') - - -# HFS Plus uses decomposed UTF-8 -def decompose(path): - if isinstance(path, unicode): - 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 - - -class TestSdistTest(unittest.TestCase): - - def setUp(self): - self.temp_dir = tempfile.mkdtemp() - f = open(os.path.join(self.temp_dir, 'setup.py'), 'w') - f.write(SETUP_PY) - f.close() - # Set up the rest of the test package - test_pkg = os.path.join(self.temp_dir, 'sdist_test') - os.mkdir(test_pkg) - # *.rst was not included in package_data, so c.rst should not be - # automatically added to the manifest when not under version control - for fname in ['__init__.py', 'a.txt', 'b.txt', 'c.rst']: - # Just touch the files; their contents are irrelevant - open(os.path.join(test_pkg, fname), 'w').close() - - self.old_cwd = os.getcwd() - os.chdir(self.temp_dir) - - def tearDown(self): - os.chdir(self.old_cwd) - shutil.rmtree(self.temp_dir) - - def test_package_data_in_sdist(self): - """Regression test for pull request #4: ensures that files listed in - package_data are included in the manifest even if they're not added to - version control. - """ - - dist = Distribution(SETUP_ATTRS) - dist.script_name = 'setup.py' - cmd = sdist(dist) - cmd.ensure_finalized() - - # squelch output - quiet() - try: - cmd.run() - finally: - unquiet() - - manifest = cmd.filelist.files - self.assertTrue(os.path.join('sdist_test', 'a.txt') in manifest) - self.assertTrue(os.path.join('sdist_test', 'b.txt') in manifest) - self.assertTrue(os.path.join('sdist_test', 'c.rst') not in manifest) - - def test_manifest_is_written_with_utf8_encoding(self): - # Test for #303. - dist = Distribution(SETUP_ATTRS) - dist.script_name = 'setup.py' - mm = manifest_maker(dist) - mm.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt') - os.mkdir('sdist_test.egg-info') - - # UTF-8 filename - filename = os.path.join('sdist_test', 'smörbröd.py') - - # Add UTF-8 filename and write manifest - quiet() - try: - mm.run() - mm.filelist.files.append(filename) - mm.write_manifest() - finally: - unquiet() - - manifest = open(mm.manifest, 'rbU') - contents = manifest.read() - manifest.close() - - # The manifest should be UTF-8 encoded - try: - u_contents = contents.decode('UTF-8') - except UnicodeDecodeError: - e = sys.exc_info()[1] - self.fail(e) - - # The manifest should contain the UTF-8 filename - if sys.version_info >= (3,): - self.assertTrue(posix(filename) in u_contents) - else: - self.assertTrue(posix(filename) in contents) - - # Python 3 only - if sys.version_info >= (3,): - - def test_write_manifest_allows_utf8_filenames(self): - # Test for #303. - dist = Distribution(SETUP_ATTRS) - dist.script_name = 'setup.py' - mm = manifest_maker(dist) - mm.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt') - os.mkdir('sdist_test.egg-info') - - # UTF-8 filename - filename = os.path.join(b('sdist_test'), b('smörbröd.py')) - - # Add filename and write manifest - quiet() - try: - mm.run() - u_filename = filename.decode('utf-8') - mm.filelist.files.append(u_filename) - # Re-write manifest - mm.write_manifest() - finally: - unquiet() - - manifest = open(mm.manifest, 'rbU') - contents = manifest.read() - manifest.close() - - # The manifest should be UTF-8 encoded - try: - contents.decode('UTF-8') - except UnicodeDecodeError: - e = sys.exc_info()[1] - self.fail(e) - - # The manifest should contain the UTF-8 filename - self.assertTrue(posix(filename) in contents) - - # The filelist should have been updated as well - self.assertTrue(u_filename in mm.filelist.files) - - def test_write_manifest_skips_non_utf8_filenames(self): - # Test for #303. - dist = Distribution(SETUP_ATTRS) - dist.script_name = 'setup.py' - mm = manifest_maker(dist) - mm.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt') - os.mkdir('sdist_test.egg-info') - - # Latin-1 filename - filename = os.path.join(b('sdist_test'), LATIN1_FILENAME) - - # Add filename with surrogates and write manifest - quiet() - try: - mm.run() - u_filename = filename.decode('utf-8', 'surrogateescape') - mm.filelist.files.append(u_filename) - # Re-write manifest - mm.write_manifest() - finally: - unquiet() - - manifest = open(mm.manifest, 'rbU') - contents = manifest.read() - manifest.close() - - # The manifest should be UTF-8 encoded - try: - contents.decode('UTF-8') - except UnicodeDecodeError: - e = sys.exc_info()[1] - self.fail(e) - - # The Latin-1 filename should have been skipped - self.assertFalse(posix(filename) in contents) - - # The filelist should have been updated as well - self.assertFalse(u_filename in mm.filelist.files) - - def test_manifest_is_read_with_utf8_encoding(self): - # Test for #303. - dist = Distribution(SETUP_ATTRS) - dist.script_name = 'setup.py' - cmd = sdist(dist) - cmd.ensure_finalized() - - # Create manifest - quiet() - try: - cmd.run() - finally: - unquiet() - - # Add UTF-8 filename to manifest - filename = os.path.join(b('sdist_test'), b('smörbröd.py')) - cmd.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt') - manifest = open(cmd.manifest, 'ab') - manifest.write(b('\n')+filename) - manifest.close() - - # The file must exist to be included in the filelist - open(filename, 'w').close() - - # Re-read manifest - cmd.filelist.files = [] - quiet() - try: - cmd.read_manifest() - finally: - unquiet() - - # The filelist should contain the UTF-8 filename - if sys.version_info >= (3,): - filename = filename.decode('utf-8') - self.assertTrue(filename in cmd.filelist.files) - - # Python 3 only - if sys.version_info >= (3,): - - def test_read_manifest_skips_non_utf8_filenames(self): - # Test for #303. - dist = Distribution(SETUP_ATTRS) - dist.script_name = 'setup.py' - cmd = sdist(dist) - cmd.ensure_finalized() - - # Create manifest - quiet() - try: - cmd.run() - finally: - unquiet() - - # Add Latin-1 filename to manifest - filename = os.path.join(b('sdist_test'), LATIN1_FILENAME) - cmd.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt') - manifest = open(cmd.manifest, 'ab') - manifest.write(b('\n')+filename) - manifest.close() - - # The file must exist to be included in the filelist - open(filename, 'w').close() - - # Re-read manifest - cmd.filelist.files = [] - quiet() - try: - try: - cmd.read_manifest() - except UnicodeDecodeError: - e = sys.exc_info()[1] - self.fail(e) - finally: - unquiet() - - # The Latin-1 filename should have been skipped - filename = filename.decode('latin-1') - self.assertFalse(filename in cmd.filelist.files) - - def test_sdist_with_utf8_encoded_filename(self): - # Test for #303. - dist = Distribution(SETUP_ATTRS) - dist.script_name = 'setup.py' - cmd = sdist(dist) - cmd.ensure_finalized() - - # UTF-8 filename - filename = os.path.join(b('sdist_test'), b('smörbröd.py')) - open(filename, 'w').close() - - quiet() - try: - cmd.run() - finally: - unquiet() - - if sys.platform == 'darwin': - filename = decompose(filename) - - if sys.version_info >= (3,): - fs_enc = sys.getfilesystemencoding() - - if sys.platform == 'win32': - if fs_enc == 'cp1252': - # Python 3 mangles the UTF-8 filename - filename = filename.decode('cp1252') - self.assertTrue(filename in cmd.filelist.files) - else: - filename = filename.decode('mbcs') - self.assertTrue(filename in cmd.filelist.files) - else: - filename = filename.decode('utf-8') - self.assertTrue(filename in cmd.filelist.files) - else: - self.assertTrue(filename in cmd.filelist.files) - - def test_sdist_with_latin1_encoded_filename(self): - # Test for #303. - dist = Distribution(SETUP_ATTRS) - dist.script_name = 'setup.py' - cmd = sdist(dist) - cmd.ensure_finalized() - - # Latin-1 filename - filename = os.path.join(b('sdist_test'), LATIN1_FILENAME) - open(filename, 'w').close() - self.assertTrue(os.path.isfile(filename)) - - quiet() - try: - cmd.run() - finally: - unquiet() - - if sys.version_info >= (3,): - #not all windows systems have a default FS encoding of cp1252 - if sys.platform == 'win32': - # Latin-1 is similar to Windows-1252 however - # on mbcs filesys it is not in latin-1 encoding - fs_enc = sys.getfilesystemencoding() - if fs_enc == 'mbcs': - filename = filename.decode('mbcs') - else: - filename = filename.decode('latin-1') - - self.assertTrue(filename in cmd.filelist.files) - else: - # The Latin-1 filename should have been skipped - filename = filename.decode('latin-1') - self.assertFalse(filename in cmd.filelist.files) - else: - # No conversion takes place under Python 2 and the file - # is included. We shall keep it that way for BBB. - self.assertTrue(filename in cmd.filelist.files) - - -def test_suite(): - return unittest.defaultTestLoader.loadTestsFromName(__name__) - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sdist.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_sdist.pyc deleted file mode 100644 index 7682f19dd8840706f33914a32602c8264c9a5a4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11272 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 CAk8rV diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_upload_docs.py b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_upload_docs.py deleted file mode 100644 index 769f16cc5..000000000 --- a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_upload_docs.py +++ /dev/null @@ -1,72 +0,0 @@ -"""build_ext tests -""" -import sys, os, shutil, tempfile, unittest, site, zipfile -from setuptools.command.upload_docs import upload_docs -from setuptools.dist import Distribution - -SETUP_PY = """\ -from setuptools import setup - -setup(name='foo') -""" - -class TestUploadDocsTest(unittest.TestCase): - def setUp(self): - self.dir = tempfile.mkdtemp() - setup = os.path.join(self.dir, 'setup.py') - f = open(setup, 'w') - f.write(SETUP_PY) - f.close() - self.old_cwd = os.getcwd() - os.chdir(self.dir) - - self.upload_dir = os.path.join(self.dir, 'build') - os.mkdir(self.upload_dir) - - # A test document. - f = open(os.path.join(self.upload_dir, 'index.html'), 'w') - f.write("Hello world.") - f.close() - - # An empty folder. - os.mkdir(os.path.join(self.upload_dir, 'empty')) - - if sys.version >= "2.6": - self.old_base = site.USER_BASE - site.USER_BASE = upload_docs.USER_BASE = tempfile.mkdtemp() - self.old_site = site.USER_SITE - site.USER_SITE = upload_docs.USER_SITE = tempfile.mkdtemp() - - def tearDown(self): - os.chdir(self.old_cwd) - shutil.rmtree(self.dir) - if sys.version >= "2.6": - shutil.rmtree(site.USER_BASE) - shutil.rmtree(site.USER_SITE) - site.USER_BASE = self.old_base - site.USER_SITE = self.old_site - - def test_create_zipfile(self): - # Test to make sure zipfile creation handles common cases. - # This explicitly includes a folder containing an empty folder. - - dist = Distribution() - - cmd = upload_docs(dist) - cmd.upload_dir = self.upload_dir - cmd.target_dir = self.upload_dir - tmp_dir = tempfile.mkdtemp() - tmp_file = os.path.join(tmp_dir, 'foo.zip') - try: - zip_file = cmd.create_zipfile(tmp_file) - - assert zipfile.is_zipfile(tmp_file) - - zip_file = zipfile.ZipFile(tmp_file) # woh... - - assert zip_file.namelist() == ['index.html'] - - zip_file.close() - finally: - shutil.rmtree(tmp_dir) - diff --git a/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_upload_docs.pyc b/PythonEnv/2.7/Lib/site-packages/setuptools/tests/test_upload_docs.pyc deleted file mode 100644 index f3b2713f59729b2513f12cd15c940eaec87433cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2853 zcmc&$>uwuG6h6DYBzEjLZAmE&qAnNJ{HTHc00{viZGwt~qOeI+YFS#@-gUChUaXyQ z(^TOP;WZGC!pramJOF&(**H$q|J2qTpEGmj%$alf#-)Fn_2I+6e;&!jr-a|{G0Yzz zfk+S3k-(MMksg?Wcctgf`I7WXbG|IS@|>?ouQKPW(yPw-CFw0GUy^uPlA82t;?Qnc z;<_X&(p!Oy-3{l=lrff<|Zt`m@(rrkiUZ!&wvue)!V1ZD_2iNB`op z({Zq5S3qXdI2#0hkc~_+*}&vhWNaP{XEw@G^EoEQd6u+IXlGNKWwB{T$u!GtF;lPW zLMI(0;kOUQS@z)5y1j`_`#A7G&2PavrOQb2_{SLLBajf0#2tipC_+aDadUO1EZ$y+ zp&xM!zCz^+ISAKQGR^?3dL(!EpS0+nhm*w0M zheC}e9PX~qjjgD$#)Ty+UN>G6SmU`(Rb5rprrN}LuW2`#LulhtS3N*3-}GShjjdH~ zQV&`(S!2GBE0S+H_J&Must30gfhc3vzbW<|rO;Scjoa5W)>UI&Qmy5pWOj@e4inv- zo>~U{#8yDHj7%L|lm_9;?vYJm!%}$~#&Om@$?`bps%Dr>?Wtj!9(BL$yo+B%83gm= zC=TrsgycA&i~!;6D7P+tGh><8>A)T-Gs&V@^D~64=b`*-}`ZYvCgepvW1~A9_x8U12L%M4tFatF}UFC{$XT~X2broDBX<5 zc^F*bhEdwz3Wu}9{_d$g%F^xhMgLLvtNu^Xu+O6&P6wmo!C`3nix%x`yDRnQ*G3mI ztGqfC52mYRJ_Zq|<=nw&I(5)Bcf(mL-KSK#=eC@Na~oqszd4w!Cm05Wb5T-7uPr)+ za#7gG3;GNQ#(JGx)HUMBe!FZa%IG?FA~vG!mc_4WFEx~}U)Ctk-nlHUCM1s;@(4HH z4G^sZa|GmymCX~IhoQ#`^wvpkldvkiJ0y2W-XqxnQ3UkfCx`L2@24KZxbD?vFH))k-0d$8*yDR3;3r#Myxa2$w z;Ov@AZty_n{TECWAirY>5O_tpucGNS!0Bk3S%cbq-YwpleQgIhdf!Jkdkl(46GdTg z)#E#78N^W@4s7Vd@+B0_d4)D}xkT+vW5S$I;C7zlwWHBqH2r}f#uV|ri}6r;EeKwl z&5Z9SSul$sdiS8vBb ucrkd!6+PC6rzOpjQ{()n^n@=AU3}YdQjfkVlK34R(w?k3`$VE@)%_1^Bzh$P diff --git a/PythonEnv/2.7/Lib/site.py b/PythonEnv/2.7/Lib/site.py deleted file mode 100644 index 3de978a0e..000000000 --- a/PythonEnv/2.7/Lib/site.py +++ /dev/null @@ -1,758 +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 sys -import os -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.%s-%.3s" % (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, "rU") - 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: - 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, "local/lib", - "python" + sys.version[:3], - "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 %s() or %s to exit' % (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, "rU") - 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://codespeak.net/pypy") - 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 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() - 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," % (dir,)) - print("]") - def exists(path): - if os.path.isdir(path): - return "exists" - else: - return "doesn't exist" - print("USER_BASE: %r (%s)" % (USER_BASE, exists(USER_BASE))) - print("USER_SITE: %r (%s)" % (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/PythonEnv/2.7/Lib/site.pyc b/PythonEnv/2.7/Lib/site.pyc deleted file mode 100644 index c466819cb687988c50ec44bc198e4bfb58750006..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25343 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 diff --git a/PythonEnv/2.7/Lib/sre.py b/PythonEnv/2.7/Lib/sre.py deleted file mode 100644 index c04576baf..000000000 --- a/PythonEnv/2.7/Lib/sre.py +++ /dev/null @@ -1,13 +0,0 @@ -"""This file is only retained for backwards compatibility. -It will be removed in the future. sre was moved to re in version 2.5. -""" - -import warnings -warnings.warn("The sre module is deprecated, please import re.", - DeprecationWarning, 2) - -from re import * -from re import __all__ - -# old pickles expect the _compile() reconstructor in this module -from re import _compile diff --git a/PythonEnv/2.7/Lib/sre_compile.py b/PythonEnv/2.7/Lib/sre_compile.py deleted file mode 100644 index 7cda2b657..000000000 --- a/PythonEnv/2.7/Lib/sre_compile.py +++ /dev/null @@ -1,525 +0,0 @@ -# -# Secret Labs' Regular Expression Engine -# -# convert template to internal format -# -# Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved. -# -# See the sre.py file for information on usage and redistribution. -# - -"""Internal support module for sre""" - -import _sre, sys -import sre_parse -from sre_constants import * -from _sre import MAXREPEAT - -assert _sre.MAGIC == MAGIC, "SRE module mismatch" - -if _sre.CODESIZE == 2: - MAXCODE = 65535 -else: - MAXCODE = 0xFFFFFFFFL - -def _identityfunction(x): - return x - -_LITERAL_CODES = set([LITERAL, NOT_LITERAL]) -_REPEATING_CODES = set([REPEAT, MIN_REPEAT, MAX_REPEAT]) -_SUCCESS_CODES = set([SUCCESS, FAILURE]) -_ASSERT_CODES = set([ASSERT, ASSERT_NOT]) - -def _compile(code, pattern, flags): - # internal: compile a (sub)pattern - emit = code.append - _len = len - LITERAL_CODES = _LITERAL_CODES - REPEATING_CODES = _REPEATING_CODES - SUCCESS_CODES = _SUCCESS_CODES - ASSERT_CODES = _ASSERT_CODES - for op, av in pattern: - if op in LITERAL_CODES: - if flags & SRE_FLAG_IGNORECASE: - emit(OPCODES[OP_IGNORE[op]]) - emit(_sre.getlower(av, flags)) - else: - emit(OPCODES[op]) - emit(av) - elif op is IN: - if flags & SRE_FLAG_IGNORECASE: - emit(OPCODES[OP_IGNORE[op]]) - def fixup(literal, flags=flags): - return _sre.getlower(literal, flags) - else: - emit(OPCODES[op]) - fixup = _identityfunction - skip = _len(code); emit(0) - _compile_charset(av, flags, code, fixup) - code[skip] = _len(code) - skip - elif op is ANY: - if flags & SRE_FLAG_DOTALL: - emit(OPCODES[ANY_ALL]) - else: - emit(OPCODES[ANY]) - elif op in REPEATING_CODES: - if flags & SRE_FLAG_TEMPLATE: - raise error, "internal: unsupported template operator" - emit(OPCODES[REPEAT]) - skip = _len(code); emit(0) - emit(av[0]) - emit(av[1]) - _compile(code, av[2], flags) - emit(OPCODES[SUCCESS]) - code[skip] = _len(code) - skip - elif _simple(av) and op is not REPEAT: - if op is MAX_REPEAT: - emit(OPCODES[REPEAT_ONE]) - else: - emit(OPCODES[MIN_REPEAT_ONE]) - skip = _len(code); emit(0) - emit(av[0]) - emit(av[1]) - _compile(code, av[2], flags) - emit(OPCODES[SUCCESS]) - code[skip] = _len(code) - skip - else: - emit(OPCODES[REPEAT]) - skip = _len(code); emit(0) - emit(av[0]) - emit(av[1]) - _compile(code, av[2], flags) - code[skip] = _len(code) - skip - if op is MAX_REPEAT: - emit(OPCODES[MAX_UNTIL]) - else: - emit(OPCODES[MIN_UNTIL]) - elif op is SUBPATTERN: - if av[0]: - emit(OPCODES[MARK]) - emit((av[0]-1)*2) - # _compile_info(code, av[1], flags) - _compile(code, av[1], flags) - if av[0]: - emit(OPCODES[MARK]) - emit((av[0]-1)*2+1) - elif op in SUCCESS_CODES: - emit(OPCODES[op]) - elif op in ASSERT_CODES: - emit(OPCODES[op]) - skip = _len(code); emit(0) - if av[0] >= 0: - emit(0) # look ahead - else: - lo, hi = av[1].getwidth() - if lo != hi: - raise error, "look-behind requires fixed-width pattern" - emit(lo) # look behind - _compile(code, av[1], flags) - emit(OPCODES[SUCCESS]) - code[skip] = _len(code) - skip - elif op is CALL: - emit(OPCODES[op]) - skip = _len(code); emit(0) - _compile(code, av, flags) - emit(OPCODES[SUCCESS]) - code[skip] = _len(code) - skip - elif op is AT: - emit(OPCODES[op]) - if flags & SRE_FLAG_MULTILINE: - av = AT_MULTILINE.get(av, av) - if flags & SRE_FLAG_LOCALE: - av = AT_LOCALE.get(av, av) - elif flags & SRE_FLAG_UNICODE: - av = AT_UNICODE.get(av, av) - emit(ATCODES[av]) - elif op is BRANCH: - emit(OPCODES[op]) - tail = [] - tailappend = tail.append - for av in av[1]: - skip = _len(code); emit(0) - # _compile_info(code, av, flags) - _compile(code, av, flags) - emit(OPCODES[JUMP]) - tailappend(_len(code)); emit(0) - code[skip] = _len(code) - skip - emit(0) # end of branch - for tail in tail: - code[tail] = _len(code) - tail - elif op is CATEGORY: - emit(OPCODES[op]) - if flags & SRE_FLAG_LOCALE: - av = CH_LOCALE[av] - elif flags & SRE_FLAG_UNICODE: - av = CH_UNICODE[av] - emit(CHCODES[av]) - elif op is GROUPREF: - if flags & SRE_FLAG_IGNORECASE: - emit(OPCODES[OP_IGNORE[op]]) - else: - emit(OPCODES[op]) - emit(av-1) - elif op is GROUPREF_EXISTS: - emit(OPCODES[op]) - emit(av[0]-1) - skipyes = _len(code); emit(0) - _compile(code, av[1], flags) - if av[2]: - emit(OPCODES[JUMP]) - skipno = _len(code); emit(0) - code[skipyes] = _len(code) - skipyes + 1 - _compile(code, av[2], flags) - code[skipno] = _len(code) - skipno - else: - code[skipyes] = _len(code) - skipyes + 1 - else: - raise ValueError, ("unsupported operand type", op) - -def _compile_charset(charset, flags, code, fixup=None): - # compile charset subprogram - emit = code.append - if fixup is None: - fixup = _identityfunction - for op, av in _optimize_charset(charset, fixup): - emit(OPCODES[op]) - if op is NEGATE: - pass - elif op is LITERAL: - emit(fixup(av)) - elif op is RANGE: - emit(fixup(av[0])) - emit(fixup(av[1])) - elif op is CHARSET: - code.extend(av) - elif op is BIGCHARSET: - code.extend(av) - elif op is CATEGORY: - if flags & SRE_FLAG_LOCALE: - emit(CHCODES[CH_LOCALE[av]]) - elif flags & SRE_FLAG_UNICODE: - emit(CHCODES[CH_UNICODE[av]]) - else: - emit(CHCODES[av]) - else: - raise error, "internal: unsupported set operator" - emit(OPCODES[FAILURE]) - -def _optimize_charset(charset, fixup): - # internal: optimize character set - out = [] - outappend = out.append - charmap = [0]*256 - try: - for op, av in charset: - if op is NEGATE: - outappend((op, av)) - elif op is LITERAL: - charmap[fixup(av)] = 1 - elif op is RANGE: - for i in range(fixup(av[0]), fixup(av[1])+1): - charmap[i] = 1 - elif op is CATEGORY: - # XXX: could append to charmap tail - return charset # cannot compress - except IndexError: - # character set contains unicode characters - return _optimize_unicode(charset, fixup) - # compress character map - i = p = n = 0 - runs = [] - runsappend = runs.append - for c in charmap: - if c: - if n == 0: - p = i - n = n + 1 - elif n: - runsappend((p, n)) - n = 0 - i = i + 1 - if n: - runsappend((p, n)) - if len(runs) <= 2: - # use literal/range - for p, n in runs: - if n == 1: - outappend((LITERAL, p)) - else: - outappend((RANGE, (p, p+n-1))) - if len(out) < len(charset): - return out - else: - # use bitmap - data = _mk_bitmap(charmap) - outappend((CHARSET, data)) - return out - return charset - -def _mk_bitmap(bits): - data = [] - dataappend = data.append - if _sre.CODESIZE == 2: - start = (1, 0) - else: - start = (1L, 0L) - m, v = start - for c in bits: - if c: - v = v + m - m = m + m - if m > MAXCODE: - dataappend(v) - m, v = start - return data - -# To represent a big charset, first a bitmap of all characters in the -# set is constructed. Then, this bitmap is sliced into chunks of 256 -# characters, duplicate chunks are eliminated, and each chunk is -# given a number. In the compiled expression, the charset is -# represented by a 16-bit word sequence, consisting of one word for -# the number of different chunks, a sequence of 256 bytes (128 words) -# of chunk numbers indexed by their original chunk position, and a -# sequence of chunks (16 words each). - -# Compression is normally good: in a typical charset, large ranges of -# Unicode will be either completely excluded (e.g. if only cyrillic -# letters are to be matched), or completely included (e.g. if large -# subranges of Kanji match). These ranges will be represented by -# chunks of all one-bits or all zero-bits. - -# Matching can be also done efficiently: the more significant byte of -# the Unicode character is an index into the chunk number, and the -# less significant byte is a bit index in the chunk (just like the -# CHARSET matching). - -# In UCS-4 mode, the BIGCHARSET opcode still supports only subsets -# of the basic multilingual plane; an efficient representation -# for all of UTF-16 has not yet been developed. This means, -# in particular, that negated charsets cannot be represented as -# bigcharsets. - -def _optimize_unicode(charset, fixup): - try: - import array - except ImportError: - return charset - charmap = [0]*65536 - negate = 0 - try: - for op, av in charset: - if op is NEGATE: - negate = 1 - elif op is LITERAL: - charmap[fixup(av)] = 1 - elif op is RANGE: - for i in xrange(fixup(av[0]), fixup(av[1])+1): - charmap[i] = 1 - elif op is CATEGORY: - # XXX: could expand category - return charset # cannot compress - except IndexError: - # non-BMP characters - return charset - if negate: - if sys.maxunicode != 65535: - # XXX: negation does not work with big charsets - return charset - for i in xrange(65536): - charmap[i] = not charmap[i] - comps = {} - mapping = [0]*256 - block = 0 - data = [] - for i in xrange(256): - chunk = tuple(charmap[i*256:(i+1)*256]) - new = comps.setdefault(chunk, block) - mapping[i] = new - if new == block: - block = block + 1 - data = data + _mk_bitmap(chunk) - header = [block] - if _sre.CODESIZE == 2: - code = 'H' - else: - code = 'I' - # Convert block indices to byte array of 256 bytes - mapping = array.array('b', mapping).tostring() - # Convert byte array to word array - mapping = array.array(code, mapping) - assert mapping.itemsize == _sre.CODESIZE - header = header + mapping.tolist() - data[0:0] = header - return [(BIGCHARSET, data)] - -def _simple(av): - # check if av is a "simple" operator - lo, hi = av[2].getwidth() - if lo == 0 and hi == MAXREPEAT: - raise error, "nothing to repeat" - return lo == hi == 1 and av[2][0][0] != SUBPATTERN - -def _compile_info(code, pattern, flags): - # internal: compile an info block. in the current version, - # this contains min/max pattern width, and an optional literal - # prefix or a character map - lo, hi = pattern.getwidth() - if lo == 0: - return # not worth it - # look for a literal prefix - prefix = [] - prefixappend = prefix.append - prefix_skip = 0 - charset = [] # not used - charsetappend = charset.append - if not (flags & SRE_FLAG_IGNORECASE): - # look for literal prefix - for op, av in pattern.data: - if op is LITERAL: - if len(prefix) == prefix_skip: - prefix_skip = prefix_skip + 1 - prefixappend(av) - elif op is SUBPATTERN and len(av[1]) == 1: - op, av = av[1][0] - if op is LITERAL: - prefixappend(av) - else: - break - else: - break - # if no prefix, look for charset prefix - if not prefix and pattern.data: - op, av = pattern.data[0] - if op is SUBPATTERN and av[1]: - op, av = av[1][0] - if op is LITERAL: - charsetappend((op, av)) - elif op is BRANCH: - c = [] - cappend = c.append - for p in av[1]: - if not p: - break - op, av = p[0] - if op is LITERAL: - cappend((op, av)) - else: - break - else: - charset = c - elif op is BRANCH: - c = [] - cappend = c.append - for p in av[1]: - if not p: - break - op, av = p[0] - if op is LITERAL: - cappend((op, av)) - else: - break - else: - charset = c - elif op is IN: - charset = av -## if prefix: -## print "*** PREFIX", prefix, prefix_skip -## if charset: -## print "*** CHARSET", charset - # add an info block - emit = code.append - emit(OPCODES[INFO]) - skip = len(code); emit(0) - # literal flag - mask = 0 - if prefix: - mask = SRE_INFO_PREFIX - if len(prefix) == prefix_skip == len(pattern.data): - mask = mask + SRE_INFO_LITERAL - elif charset: - mask = mask + SRE_INFO_CHARSET - emit(mask) - # pattern length - if lo < MAXCODE: - emit(lo) - else: - emit(MAXCODE) - prefix = prefix[:MAXCODE] - if hi < MAXCODE: - emit(hi) - else: - emit(0) - # add literal prefix - if prefix: - emit(len(prefix)) # length - emit(prefix_skip) # skip - code.extend(prefix) - # generate overlap table - table = [-1] + ([0]*len(prefix)) - for i in xrange(len(prefix)): - table[i+1] = table[i]+1 - while table[i+1] > 0 and prefix[i] != prefix[table[i+1]-1]: - table[i+1] = table[table[i+1]-1]+1 - code.extend(table[1:]) # don't store first entry - elif charset: - _compile_charset(charset, flags, code) - code[skip] = len(code) - skip - -try: - unicode -except NameError: - STRING_TYPES = (type(""),) -else: - STRING_TYPES = (type(""), type(unicode(""))) - -def isstring(obj): - for tp in STRING_TYPES: - if isinstance(obj, tp): - return 1 - return 0 - -def _code(p, flags): - - flags = p.pattern.flags | flags - code = [] - - # compile info block - _compile_info(code, p, flags) - - # compile the pattern - _compile(code, p.data, flags) - - code.append(OPCODES[SUCCESS]) - - return code - -def compile(p, flags=0): - # internal: convert pattern list to internal format - - if isstring(p): - pattern = p - p = sre_parse.parse(p, flags) - else: - pattern = None - - code = _code(p, flags) - - # print code - - # XXX: get rid of this limitation! - if p.pattern.groups > 100: - raise AssertionError( - "sorry, but this version only supports 100 named groups" - ) - - # map in either direction - groupindex = p.pattern.groupdict - indexgroup = [None] * p.pattern.groups - for k, i in groupindex.items(): - indexgroup[i] = k - - return _sre.compile( - pattern, flags | p.pattern.flags, code, - p.pattern.groups-1, - groupindex, indexgroup - ) diff --git a/PythonEnv/2.7/Lib/sre_compile.pyc b/PythonEnv/2.7/Lib/sre_compile.pyc deleted file mode 100644 index 9617d7d0548b837c25d7afac7bc8e6fead224f0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11569 zcmcIqU2I%uT7J)&@z~?v@lRqqKg}eYO-<9L?Utq8DvL6)r-@r<>>S&55^PPzGspJW z6S-nsi&mU!%8JBU&sEv;`WK#FYbVB+FbZ(PSldl8Xd8zbk=LM+@Xyu|*2DS2>RED&2Nh%qwWaXeo+{f&;5c_hKb1rU|yB_C3z5cp@KDLm@`1Vt5O+Jh+mY-s8+5?WlSn( z6sPBj-{RC+-oqsnv-QCB>ZMxN-)}Y>UXa~wRQ79bcBA2Ceb23ahJS@AT$ltbUNF@( zs`qjaocuyQx8#qawdmxdrMp#sw-l7Osy6xoK%|yH?X$0a_O*nR2_^bWqwXhB90Gts zE=-{%?fqJ&%})O=ipra-o7G@ze|>eOTF=!sJh#$OTd&qvXWaGu&DDj2V5?Ej*PpC@ z>Bj4;wd(pR4pS^QcAM3jd!u;}3rqdv)Ph_zT{qRfM(@KHQ} z+^u+SiyS3LjH9Fkwj6aykdUL41W7sSmY_?HdZhKe?n6sv*1p@liWzA+>XpN^9Cpc0 zO1$5dLtBEB-12@!4gm>^dN@2ei3_yYla_5Pz#o`W`O@0^VYivedEqonU~TUP7YBW^ z(<9zxD}w#~XTes%0%soeNqsDw5J3$3*?pMgT>$P;KgYo<+#?tW(ZSeZpL~!6p3%g^ zewko*zuXK_8B|mrDk?)b=3PA$j+rsI$A<|9!wx;dA%qp=`Er6s7{jl0X+E0mdB!sw7P-z-fUahPz~vWK9@K1F177V0ND8huy(ht^y6bk8F~8 zRCdx)eO%9Z%{Dg^Oc+4*!3f*Q6Od0I+Ypn_mrN0{I|xHcnA2ZPgnOPdhi%{O`LM&V z=LMzJcN5_ad0w>cVo0R;@^EDnxTP`jT^(8{zBycFbaUpKy+|m6p9loN#t8^$8Rk6f zRwnyFxP8R@;b4yr{$A3YDH@Df{rCkMB*1SwUE)n~O(-q(HEStOJ}4NL^m)J?VO?&ZH_KgnL|*SucubR6J6I6{rQO#;eM2K-%JHBDh)`{@t9

xfFJq=i}?5%6oJULrKZIqw?{q<=fNL< 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 diff --git a/PythonEnv/2.7/Lib/sre_parse.py b/PythonEnv/2.7/Lib/sre_parse.py deleted file mode 100644 index 75f8c9601..000000000 --- a/PythonEnv/2.7/Lib/sre_parse.py +++ /dev/null @@ -1,803 +0,0 @@ -# -# Secret Labs' Regular Expression Engine -# -# convert re-style regular expression to sre pattern -# -# Copyright (c) 1998-2001 by Secret Labs AB. All rights reserved. -# -# See the sre.py file for information on usage and redistribution. -# - -"""Internal support module for sre""" - -# XXX: show string offset and offending character for all errors - -import sys - -from sre_constants import * -from _sre import MAXREPEAT - -SPECIAL_CHARS = ".\\[{()*+?^$|" -REPEAT_CHARS = "*+?{" - -DIGITS = set("0123456789") - -OCTDIGITS = set("01234567") -HEXDIGITS = set("0123456789abcdefABCDEF") - -WHITESPACE = set(" \t\n\r\v\f") - -ESCAPES = { - r"\a": (LITERAL, ord("\a")), - r"\b": (LITERAL, ord("\b")), - r"\f": (LITERAL, ord("\f")), - r"\n": (LITERAL, ord("\n")), - r"\r": (LITERAL, ord("\r")), - r"\t": (LITERAL, ord("\t")), - r"\v": (LITERAL, ord("\v")), - r"\\": (LITERAL, ord("\\")) -} - -CATEGORIES = { - r"\A": (AT, AT_BEGINNING_STRING), # start of string - r"\b": (AT, AT_BOUNDARY), - r"\B": (AT, AT_NON_BOUNDARY), - r"\d": (IN, [(CATEGORY, CATEGORY_DIGIT)]), - r"\D": (IN, [(CATEGORY, CATEGORY_NOT_DIGIT)]), - r"\s": (IN, [(CATEGORY, CATEGORY_SPACE)]), - r"\S": (IN, [(CATEGORY, CATEGORY_NOT_SPACE)]), - r"\w": (IN, [(CATEGORY, CATEGORY_WORD)]), - r"\W": (IN, [(CATEGORY, CATEGORY_NOT_WORD)]), - r"\Z": (AT, AT_END_STRING), # end of string -} - -FLAGS = { - # standard flags - "i": SRE_FLAG_IGNORECASE, - "L": SRE_FLAG_LOCALE, - "m": SRE_FLAG_MULTILINE, - "s": SRE_FLAG_DOTALL, - "x": SRE_FLAG_VERBOSE, - # extensions - "t": SRE_FLAG_TEMPLATE, - "u": SRE_FLAG_UNICODE, -} - -class Pattern: - # master pattern object. keeps track of global attributes - def __init__(self): - self.flags = 0 - self.open = [] - self.groups = 1 - self.groupdict = {} - def opengroup(self, name=None): - gid = self.groups - self.groups = gid + 1 - if name is not None: - ogid = self.groupdict.get(name, None) - if ogid is not None: - raise error, ("redefinition of group name %s as group %d; " - "was group %d" % (repr(name), gid, ogid)) - self.groupdict[name] = gid - self.open.append(gid) - return gid - def closegroup(self, gid): - self.open.remove(gid) - def checkgroup(self, gid): - return gid < self.groups and gid not in self.open - -class SubPattern: - # a subpattern, in intermediate form - def __init__(self, pattern, data=None): - self.pattern = pattern - if data is None: - data = [] - self.data = data - self.width = None - def dump(self, level=0): - nl = 1 - seqtypes = type(()), type([]) - for op, av in self.data: - print level*" " + op,; nl = 0 - if op == "in": - # member sublanguage - print; nl = 1 - for op, a in av: - print (level+1)*" " + op, a - elif op == "branch": - print; nl = 1 - i = 0 - for a in av[1]: - if i > 0: - print level*" " + "or" - a.dump(level+1); nl = 1 - i = i + 1 - elif type(av) in seqtypes: - for a in av: - if isinstance(a, SubPattern): - if not nl: print - a.dump(level+1); nl = 1 - else: - print a, ; nl = 0 - else: - print av, ; nl = 0 - if not nl: print - def __repr__(self): - return repr(self.data) - def __len__(self): - return len(self.data) - def __delitem__(self, index): - del self.data[index] - def __getitem__(self, index): - if isinstance(index, slice): - return SubPattern(self.pattern, self.data[index]) - return self.data[index] - def __setitem__(self, index, code): - self.data[index] = code - def insert(self, index, code): - self.data.insert(index, code) - def append(self, code): - self.data.append(code) - def getwidth(self): - # determine the width (min, max) for this subpattern - if self.width: - return self.width - lo = hi = 0L - UNITCODES = (ANY, RANGE, IN, LITERAL, NOT_LITERAL, CATEGORY) - REPEATCODES = (MIN_REPEAT, MAX_REPEAT) - for op, av in self.data: - if op is BRANCH: - i = sys.maxint - j = 0 - for av in av[1]: - l, h = av.getwidth() - i = min(i, l) - j = max(j, h) - lo = lo + i - hi = hi + j - elif op is CALL: - i, j = av.getwidth() - lo = lo + i - hi = hi + j - elif op is SUBPATTERN: - i, j = av[1].getwidth() - lo = lo + i - hi = hi + j - elif op in REPEATCODES: - i, j = av[2].getwidth() - lo = lo + long(i) * av[0] - hi = hi + long(j) * av[1] - elif op in UNITCODES: - lo = lo + 1 - hi = hi + 1 - elif op == SUCCESS: - break - self.width = int(min(lo, sys.maxint)), int(min(hi, sys.maxint)) - return self.width - -class Tokenizer: - def __init__(self, string): - self.string = string - self.index = 0 - self.__next() - def __next(self): - if self.index >= len(self.string): - self.next = None - return - char = self.string[self.index] - if char[0] == "\\": - try: - c = self.string[self.index + 1] - except IndexError: - raise error, "bogus escape (end of line)" - char = char + c - self.index = self.index + len(char) - self.next = char - def match(self, char, skip=1): - if char == self.next: - if skip: - self.__next() - return 1 - return 0 - def get(self): - this = self.next - self.__next() - return this - def tell(self): - return self.index, self.next - def seek(self, index): - self.index, self.next = index - -def isident(char): - return "a" <= char <= "z" or "A" <= char <= "Z" or char == "_" - -def isdigit(char): - return "0" <= char <= "9" - -def isname(name): - # check that group name is a valid string - if not isident(name[0]): - return False - for char in name[1:]: - if not isident(char) and not isdigit(char): - return False - return True - -def _class_escape(source, escape): - # handle escape code inside character class - code = ESCAPES.get(escape) - if code: - return code - code = CATEGORIES.get(escape) - if code and code[0] == IN: - return code - try: - c = escape[1:2] - if c == "x": - # hexadecimal escape (exactly two digits) - while source.next in HEXDIGITS and len(escape) < 4: - escape = escape + source.get() - escape = escape[2:] - if len(escape) != 2: - raise error, "bogus escape: %s" % repr("\\" + escape) - return LITERAL, int(escape, 16) & 0xff - elif c in OCTDIGITS: - # octal escape (up to three digits) - while source.next in OCTDIGITS and len(escape) < 4: - escape = escape + source.get() - escape = escape[1:] - return LITERAL, int(escape, 8) & 0xff - elif c in DIGITS: - raise error, "bogus escape: %s" % repr(escape) - if len(escape) == 2: - return LITERAL, ord(escape[1]) - except ValueError: - pass - raise error, "bogus escape: %s" % repr(escape) - -def _escape(source, escape, state): - # handle escape code in expression - code = CATEGORIES.get(escape) - if code: - return code - code = ESCAPES.get(escape) - if code: - return code - try: - c = escape[1:2] - if c == "x": - # hexadecimal escape - while source.next in HEXDIGITS and len(escape) < 4: - escape = escape + source.get() - if len(escape) != 4: - raise ValueError - return LITERAL, int(escape[2:], 16) & 0xff - elif c == "0": - # octal escape - while source.next in OCTDIGITS and len(escape) < 4: - escape = escape + source.get() - return LITERAL, int(escape[1:], 8) & 0xff - elif c in DIGITS: - # octal escape *or* decimal group reference (sigh) - if source.next in DIGITS: - escape = escape + source.get() - if (escape[1] in OCTDIGITS and escape[2] in OCTDIGITS and - source.next in OCTDIGITS): - # got three octal digits; this is an octal escape - escape = escape + source.get() - return LITERAL, int(escape[1:], 8) & 0xff - # not an octal escape, so this is a group reference - group = int(escape[1:]) - if group < state.groups: - if not state.checkgroup(group): - raise error, "cannot refer to open group" - return GROUPREF, group - raise ValueError - if len(escape) == 2: - return LITERAL, ord(escape[1]) - except ValueError: - pass - raise error, "bogus escape: %s" % repr(escape) - -def _parse_sub(source, state, nested=1): - # parse an alternation: a|b|c - - items = [] - itemsappend = items.append - sourcematch = source.match - while 1: - itemsappend(_parse(source, state)) - if sourcematch("|"): - continue - if not nested: - break - if not source.next or sourcematch(")", 0): - break - else: - raise error, "pattern not properly closed" - - if len(items) == 1: - return items[0] - - subpattern = SubPattern(state) - subpatternappend = subpattern.append - - # check if all items share a common prefix - while 1: - prefix = None - for item in items: - if not item: - break - if prefix is None: - prefix = item[0] - elif item[0] != prefix: - break - else: - # all subitems start with a common "prefix". - # move it out of the branch - for item in items: - del item[0] - subpatternappend(prefix) - continue # check next one - break - - # check if the branch can be replaced by a character set - for item in items: - if len(item) != 1 or item[0][0] != LITERAL: - break - else: - # we can store this as a character set instead of a - # branch (the compiler may optimize this even more) - set = [] - setappend = set.append - for item in items: - setappend(item[0]) - subpatternappend((IN, set)) - return subpattern - - subpattern.append((BRANCH, (None, items))) - return subpattern - -def _parse_sub_cond(source, state, condgroup): - item_yes = _parse(source, state) - if source.match("|"): - item_no = _parse(source, state) - if source.match("|"): - raise error, "conditional backref with more than two branches" - else: - item_no = None - if source.next and not source.match(")", 0): - raise error, "pattern not properly closed" - subpattern = SubPattern(state) - subpattern.append((GROUPREF_EXISTS, (condgroup, item_yes, item_no))) - return subpattern - -_PATTERNENDERS = set("|)") -_ASSERTCHARS = set("=!<") -_LOOKBEHINDASSERTCHARS = set("=!") -_REPEATCODES = set([MIN_REPEAT, MAX_REPEAT]) - -def _parse(source, state): - # parse a simple pattern - subpattern = SubPattern(state) - - # precompute constants into local variables - subpatternappend = subpattern.append - sourceget = source.get - sourcematch = source.match - _len = len - PATTERNENDERS = _PATTERNENDERS - ASSERTCHARS = _ASSERTCHARS - LOOKBEHINDASSERTCHARS = _LOOKBEHINDASSERTCHARS - REPEATCODES = _REPEATCODES - - while 1: - - if source.next in PATTERNENDERS: - break # end of subpattern - this = sourceget() - if this is None: - break # end of pattern - - if state.flags & SRE_FLAG_VERBOSE: - # skip whitespace and comments - if this in WHITESPACE: - continue - if this == "#": - while 1: - this = sourceget() - if this in (None, "\n"): - break - continue - - if this and this[0] not in SPECIAL_CHARS: - subpatternappend((LITERAL, ord(this))) - - elif this == "[": - # character set - set = [] - setappend = set.append -## if sourcematch(":"): -## pass # handle character classes - if sourcematch("^"): - setappend((NEGATE, None)) - # check remaining characters - start = set[:] - while 1: - this = sourceget() - if this == "]" and set != start: - break - elif this and this[0] == "\\": - code1 = _class_escape(source, this) - elif this: - code1 = LITERAL, ord(this) - else: - raise error, "unexpected end of regular expression" - if sourcematch("-"): - # potential range - this = sourceget() - if this == "]": - if code1[0] is IN: - code1 = code1[1][0] - setappend(code1) - setappend((LITERAL, ord("-"))) - break - elif this: - if this[0] == "\\": - code2 = _class_escape(source, this) - else: - code2 = LITERAL, ord(this) - if code1[0] != LITERAL or code2[0] != LITERAL: - raise error, "bad character range" - lo = code1[1] - hi = code2[1] - if hi < lo: - raise error, "bad character range" - setappend((RANGE, (lo, hi))) - else: - raise error, "unexpected end of regular expression" - else: - if code1[0] is IN: - code1 = code1[1][0] - setappend(code1) - - # XXX: should move set optimization to compiler! - if _len(set)==1 and set[0][0] is LITERAL: - subpatternappend(set[0]) # optimization - elif _len(set)==2 and set[0][0] is NEGATE and set[1][0] is LITERAL: - subpatternappend((NOT_LITERAL, set[1][1])) # optimization - else: - # XXX: should add charmap optimization here - subpatternappend((IN, set)) - - elif this and this[0] in REPEAT_CHARS: - # repeat previous item - if this == "?": - min, max = 0, 1 - elif this == "*": - min, max = 0, MAXREPEAT - - elif this == "+": - min, max = 1, MAXREPEAT - elif this == "{": - if source.next == "}": - subpatternappend((LITERAL, ord(this))) - continue - here = source.tell() - min, max = 0, MAXREPEAT - lo = hi = "" - while source.next in DIGITS: - lo = lo + source.get() - if sourcematch(","): - while source.next in DIGITS: - hi = hi + sourceget() - else: - hi = lo - if not sourcematch("}"): - subpatternappend((LITERAL, ord(this))) - source.seek(here) - continue - if lo: - min = int(lo) - if min >= MAXREPEAT: - raise OverflowError("the repetition number is too large") - if hi: - max = int(hi) - if max >= MAXREPEAT: - raise OverflowError("the repetition number is too large") - if max < min: - raise error("bad repeat interval") - else: - raise error, "not supported" - # figure out which item to repeat - if subpattern: - item = subpattern[-1:] - else: - item = None - if not item or (_len(item) == 1 and item[0][0] == AT): - raise error, "nothing to repeat" - if item[0][0] in REPEATCODES: - raise error, "multiple repeat" - if sourcematch("?"): - subpattern[-1] = (MIN_REPEAT, (min, max, item)) - else: - subpattern[-1] = (MAX_REPEAT, (min, max, item)) - - elif this == ".": - subpatternappend((ANY, None)) - - elif this == "(": - group = 1 - name = None - condgroup = None - if sourcematch("?"): - group = 0 - # options - if sourcematch("P"): - # python extensions - if sourcematch("<"): - # named group: skip forward to end of name - name = "" - while 1: - char = sourceget() - if char is None: - raise error, "unterminated name" - if char == ">": - break - name = name + char - group = 1 - if not name: - raise error("missing group name") - if not isname(name): - raise error("bad character in group name %r" % - name) - elif sourcematch("="): - # named backreference - name = "" - while 1: - char = sourceget() - if char is None: - raise error, "unterminated name" - if char == ")": - break - name = name + char - if not name: - raise error("missing group name") - if not isname(name): - raise error("bad character in backref group name " - "%r" % name) - gid = state.groupdict.get(name) - if gid is None: - raise error, "unknown group name" - subpatternappend((GROUPREF, gid)) - continue - else: - char = sourceget() - if char is None: - raise error, "unexpected end of pattern" - raise error, "unknown specifier: ?P%s" % char - elif sourcematch(":"): - # non-capturing group - group = 2 - elif sourcematch("#"): - # comment - while 1: - if source.next is None or source.next == ")": - break - sourceget() - if not sourcematch(")"): - raise error, "unbalanced parenthesis" - continue - elif source.next in ASSERTCHARS: - # lookahead assertions - char = sourceget() - dir = 1 - if char == "<": - if source.next not in LOOKBEHINDASSERTCHARS: - raise error, "syntax error" - dir = -1 # lookbehind - char = sourceget() - p = _parse_sub(source, state) - if not sourcematch(")"): - raise error, "unbalanced parenthesis" - if char == "=": - subpatternappend((ASSERT, (dir, p))) - else: - subpatternappend((ASSERT_NOT, (dir, p))) - continue - elif sourcematch("("): - # conditional backreference group - condname = "" - while 1: - char = sourceget() - if char is None: - raise error, "unterminated name" - if char == ")": - break - condname = condname + char - group = 2 - if not condname: - raise error("missing group name") - if isname(condname): - condgroup = state.groupdict.get(condname) - if condgroup is None: - raise error, "unknown group name" - else: - try: - condgroup = int(condname) - except ValueError: - raise error, "bad character in group name" - else: - # flags - if not source.next in FLAGS: - raise error, "unexpected end of pattern" - while source.next in FLAGS: - state.flags = state.flags | FLAGS[sourceget()] - if group: - # parse group contents - if group == 2: - # anonymous group - group = None - else: - group = state.opengroup(name) - if condgroup: - p = _parse_sub_cond(source, state, condgroup) - else: - p = _parse_sub(source, state) - if not sourcematch(")"): - raise error, "unbalanced parenthesis" - if group is not None: - state.closegroup(group) - subpatternappend((SUBPATTERN, (group, p))) - else: - while 1: - char = sourceget() - if char is None: - raise error, "unexpected end of pattern" - if char == ")": - break - raise error, "unknown extension" - - elif this == "^": - subpatternappend((AT, AT_BEGINNING)) - - elif this == "$": - subpattern.append((AT, AT_END)) - - elif this and this[0] == "\\": - code = _escape(source, this, state) - subpatternappend(code) - - else: - raise error, "parser error" - - return subpattern - -def parse(str, flags=0, pattern=None): - # parse 're' pattern into list of (opcode, argument) tuples - - source = Tokenizer(str) - - if pattern is None: - pattern = Pattern() - pattern.flags = flags - pattern.str = str - - p = _parse_sub(source, pattern, 0) - - tail = source.get() - if tail == ")": - raise error, "unbalanced parenthesis" - elif tail: - raise error, "bogus characters at end of regular expression" - - if flags & SRE_FLAG_DEBUG: - p.dump() - - if not (flags & SRE_FLAG_VERBOSE) and p.pattern.flags & SRE_FLAG_VERBOSE: - # the VERBOSE flag was switched on inside the pattern. to be - # on the safe side, we'll parse the whole thing again... - return parse(str, p.pattern.flags) - - return p - -def parse_template(source, pattern): - # parse 're' replacement string into list of literals and - # group references - s = Tokenizer(source) - sget = s.get - p = [] - a = p.append - def literal(literal, p=p, pappend=a): - if p and p[-1][0] is LITERAL: - p[-1] = LITERAL, p[-1][1] + literal - else: - pappend((LITERAL, literal)) - sep = source[:0] - if type(sep) is type(""): - makechar = chr - else: - makechar = unichr - while 1: - this = sget() - if this is None: - break # end of replacement string - if this and this[0] == "\\": - # group - c = this[1:2] - if c == "g": - name = "" - if s.match("<"): - while 1: - char = sget() - if char is None: - raise error, "unterminated group name" - if char == ">": - break - name = name + char - if not name: - raise error, "missing group name" - try: - index = int(name) - if index < 0: - raise error, "negative group number" - except ValueError: - if not isname(name): - raise error, "bad character in group name" - try: - index = pattern.groupindex[name] - except KeyError: - raise IndexError, "unknown group name" - a((MARK, index)) - elif c == "0": - if s.next in OCTDIGITS: - this = this + sget() - if s.next in OCTDIGITS: - this = this + sget() - literal(makechar(int(this[1:], 8) & 0xff)) - elif c in DIGITS: - isoctal = False - if s.next in DIGITS: - this = this + sget() - if (c in OCTDIGITS and this[2] in OCTDIGITS and - s.next in OCTDIGITS): - this = this + sget() - isoctal = True - literal(makechar(int(this[1:], 8) & 0xff)) - if not isoctal: - a((MARK, int(this[1:]))) - else: - try: - this = makechar(ESCAPES[this][1]) - except KeyError: - pass - literal(this) - else: - literal(this) - # convert template to groups and literals lists - i = 0 - groups = [] - groupsappend = groups.append - literals = [None] * len(p) - for c, s in p: - if c is MARK: - groupsappend((i, s)) - # literal[i] is already None - else: - literals[i] = s - i = i + 1 - return groups, literals - -def expand_template(template, match): - g = match.group - sep = match.string[:0] - groups, literals = template - literals = literals[:] - try: - for index, group in groups: - literals[index] = s = g(group) - if s is None: - raise error, "unmatched group" - except IndexError: - raise error, "invalid group reference" - return sep.join(literals) diff --git a/PythonEnv/2.7/Lib/sre_parse.pyc b/PythonEnv/2.7/Lib/sre_parse.pyc deleted file mode 100644 index 0141a4038c2e816778b32d425c5b88495e03d99a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20820 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 S>=L$dEcJ;w*?S;0|NjBD46S?s diff --git a/PythonEnv/2.7/Lib/stat.py b/PythonEnv/2.7/Lib/stat.py deleted file mode 100644 index abed5c9e0..000000000 --- a/PythonEnv/2.7/Lib/stat.py +++ /dev/null @@ -1,96 +0,0 @@ -"""Constants/functions for interpreting results of os.stat() and os.lstat(). - -Suggested usage: from stat import * -""" - -# Indices for stat struct members in the tuple returned by os.stat() - -ST_MODE = 0 -ST_INO = 1 -ST_DEV = 2 -ST_NLINK = 3 -ST_UID = 4 -ST_GID = 5 -ST_SIZE = 6 -ST_ATIME = 7 -ST_MTIME = 8 -ST_CTIME = 9 - -# Extract bits from the mode - -def S_IMODE(mode): - return mode & 07777 - -def S_IFMT(mode): - return mode & 0170000 - -# Constants used as S_IFMT() for various file types -# (not all are implemented on all systems) - -S_IFDIR = 0040000 -S_IFCHR = 0020000 -S_IFBLK = 0060000 -S_IFREG = 0100000 -S_IFIFO = 0010000 -S_IFLNK = 0120000 -S_IFSOCK = 0140000 - -# Functions to test for each file type - -def S_ISDIR(mode): - return S_IFMT(mode) == S_IFDIR - -def S_ISCHR(mode): - return S_IFMT(mode) == S_IFCHR - -def S_ISBLK(mode): - return S_IFMT(mode) == S_IFBLK - -def S_ISREG(mode): - return S_IFMT(mode) == S_IFREG - -def S_ISFIFO(mode): - return S_IFMT(mode) == S_IFIFO - -def S_ISLNK(mode): - return S_IFMT(mode) == S_IFLNK - -def S_ISSOCK(mode): - return S_IFMT(mode) == S_IFSOCK - -# Names for permission bits - -S_ISUID = 04000 -S_ISGID = 02000 -S_ENFMT = S_ISGID -S_ISVTX = 01000 -S_IREAD = 00400 -S_IWRITE = 00200 -S_IEXEC = 00100 -S_IRWXU = 00700 -S_IRUSR = 00400 -S_IWUSR = 00200 -S_IXUSR = 00100 -S_IRWXG = 00070 -S_IRGRP = 00040 -S_IWGRP = 00020 -S_IXGRP = 00010 -S_IRWXO = 00007 -S_IROTH = 00004 -S_IWOTH = 00002 -S_IXOTH = 00001 - -# Names for file flags - -UF_NODUMP = 0x00000001 -UF_IMMUTABLE = 0x00000002 -UF_APPEND = 0x00000004 -UF_OPAQUE = 0x00000008 -UF_NOUNLINK = 0x00000010 -UF_COMPRESSED = 0x00000020 # OS X: file is hfs-compressed -UF_HIDDEN = 0x00008000 # OS X: file should not be displayed -SF_ARCHIVED = 0x00010000 -SF_IMMUTABLE = 0x00020000 -SF_APPEND = 0x00040000 -SF_NOUNLINK = 0x00100000 -SF_SNAPSHOT = 0x00200000 diff --git a/PythonEnv/2.7/Lib/stat.pyc b/PythonEnv/2.7/Lib/stat.pyc deleted file mode 100644 index f80d03be94e0b458f2268a414e41d3bdf8a87bac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3121 zcmcguYi}Ay6g}7&8~n_}iSypPvD1(AYE;`sdwlL==AOCC&M^M>Z0h$viq0;Ee=+{Q&QI@W zW&|k47*q^21~mp6hZ+aPq2izks0mO4Dgl~=ngmTjO@We7Nl*$Z1)9chJjpa@Mw1!P zEYvJ$4r&fG4>b>3fLZ{ZgE|K~4|N`N0qO$iq8@S)w5Z7<=#nOvK$kVS3|i7;33Nr1 zE1;{ITm@Z&x(2!qbsbH{8=xCdH$gX{Zh>w=86X4dHt06g9qqrX{r9y0KIjhA1JGTl zhoE~%z04K8{71SWpXug&t}&xMk9G75o&Q9SeX8gAQZM!y=swg}pa)Q2gC0Vy zg3?gWLCa9zfL7q8AIX={VaRpby>Po7_8#x`+q+@Frm@%Q8bLd3b`QJFFle`oZnM|l z4|_&u&*=0roFAr_jqNsxwLdU3sg&1mwVJ)KNk+f7-D<8Gd)>}~Az>ppIP7#oVhCmaK|8y@*KN`W+X>o@d~>JYYLs7xuR3kB{Zr#&>@;K% znZwtiNb`KFo24b=r$=T^cH_(9-}z=FV^ z0&hRmV-6$KZT>ZeFoqw;c+*I4ZQXHK79Mq@khfeNJDo)hd+tdUuKLlQf0E?f##u<_ zD*8qH*f#kj$uBlvo*Y^jv#kXuHqIq*G)UqnRy=mDmBY)M(N3_UP zpLP}Bvy>U7XDe3e$S92(IWb&0mi2+`%5Cb(Me52lZc<=cU{-+dNVsw}x}we%F>Xp= zMqo}rA4t)GE6O5%B+WN%zFv;}Ta|jmT{D{>NcOFoYgNoBVAjoC#NArGdc>=q8}Zr* zua9ufFGe|T(Je>3Hp1&8ob#P1$8{>3QZ+{)Uy$o3_sP3VznjZCG0zm11lk zFD40tVlq8jwlkc5XnS_H>}@!eG>1?AmxFAEZ}}%vf4}*iY>{4A;3+_d@hid;jJ-*~DtJ?X)8Nej*1$UjSO;$w@HBXHFsuQd0dF3j>3NvI zv+%M8xerPyt>8JH1MfTxF95y)9?A277a*aq7s>zf*#CF-Cu2g}UIbbACU}4y+c%92IVFT$(R?IVb* z5YIq7B?|$*_Zs5SkY!g#xO+{e9|Mw}HeM3_k|;kJ;gL^Mrq{*vDdP@6_cNK^5R(#o z6Yv&zp96jY-fcR+We^9RJ-;CDQ%$RAdhKoG4JO{vRSJ= zp#=pw1lA35bo)VWU6Z(`Z&Ra#%ZEwG$%+tN~mfizLRnY1~OsRChTHlu0zx zwpNM7#v!&T!RvW$^71$~7jC;YPe(g)fPqdU6QcxpT4D*nn;p6qmQNTCk_5{rs{+N7 zdD{W85Z+H1iC#`g4^VkZ0%L8QQl2=OYXn4ldNkoTEg!OKhcsa8BsK;*;>S)LxmzB| zm6a(UGaMIx5e`G>*9OUKwh8j(%4MX=YP>j5Y5N^!un|*=OW(B!I+|mt3}Gl1WM# z0FTS~P%nF)ieu= 0, \ - "lineno must be an int >= 0" - item = (action, re.compile(message, re.I), category, - re.compile(module), lineno) - if append: - filters.append(item) - else: - filters.insert(0, item) - -def simplefilter(action, category=Warning, lineno=0, append=0): - """Insert a simple entry into the list of warnings filters (at the front). - - A simple filter matches all modules and messages. - 'action' -- one of "error", "ignore", "always", "default", "module", - or "once" - 'category' -- a class that the warning must be a subclass of - 'lineno' -- an integer line number, 0 matches all warnings - 'append' -- if true, append to the list of filters - """ - assert action in ("error", "ignore", "always", "default", "module", - "once"), "invalid action: %r" % (action,) - assert isinstance(lineno, int) and lineno >= 0, \ - "lineno must be an int >= 0" - item = (action, None, category, None, lineno) - if append: - filters.append(item) - else: - filters.insert(0, item) - -def resetwarnings(): - """Clear the list of warning filters, so that no filters are active.""" - filters[:] = [] - -class _OptionError(Exception): - """Exception used by option processing helpers.""" - pass - -# Helper to process -W options passed via sys.warnoptions -def _processoptions(args): - for arg in args: - try: - _setoption(arg) - except _OptionError, msg: - print >>sys.stderr, "Invalid -W option ignored:", msg - -# Helper for _processoptions() -def _setoption(arg): - import re - parts = arg.split(':') - if len(parts) > 5: - raise _OptionError("too many fields (max 5): %r" % (arg,)) - while len(parts) < 5: - parts.append('') - action, message, category, module, lineno = [s.strip() - for s in parts] - action = _getaction(action) - message = re.escape(message) - category = _getcategory(category) - module = re.escape(module) - if module: - module = module + '$' - if lineno: - try: - lineno = int(lineno) - if lineno < 0: - raise ValueError - except (ValueError, OverflowError): - raise _OptionError("invalid lineno %r" % (lineno,)) - else: - lineno = 0 - filterwarnings(action, message, category, module, lineno) - -# Helper for _setoption() -def _getaction(action): - if not action: - return "default" - if action == "all": return "always" # Alias - for a in ('default', 'always', 'ignore', 'module', 'once', 'error'): - if a.startswith(action): - return a - raise _OptionError("invalid action: %r" % (action,)) - -# Helper for _setoption() -def _getcategory(category): - import re - if not category: - return Warning - if re.match("^[a-zA-Z0-9_]+$", category): - try: - cat = eval(category) - except NameError: - raise _OptionError("unknown warning category: %r" % (category,)) - else: - i = category.rfind(".") - module = category[:i] - klass = category[i+1:] - try: - m = __import__(module, None, None, [klass]) - except ImportError: - raise _OptionError("invalid module name: %r" % (module,)) - try: - cat = getattr(m, klass) - except AttributeError: - raise _OptionError("unknown warning category: %r" % (category,)) - if not issubclass(cat, Warning): - raise _OptionError("invalid warning category: %r" % (category,)) - return cat - - -# Code typically replaced by _warnings -def warn(message, category=None, stacklevel=1): - """Issue a warning, or maybe ignore it or raise an exception.""" - # Check if message is already a Warning object - if isinstance(message, Warning): - category = message.__class__ - # Check category argument - if category is None: - category = UserWarning - assert issubclass(category, Warning) - # Get context information - try: - caller = sys._getframe(stacklevel) - except ValueError: - globals = sys.__dict__ - lineno = 1 - else: - globals = caller.f_globals - lineno = caller.f_lineno - if '__name__' in globals: - module = globals['__name__'] - else: - module = "" - filename = globals.get('__file__') - if filename: - fnl = filename.lower() - if fnl.endswith((".pyc", ".pyo")): - filename = filename[:-1] - else: - if module == "__main__": - try: - filename = sys.argv[0] - except AttributeError: - # embedded interpreters don't have sys.argv, see bug #839151 - filename = '__main__' - if not filename: - filename = module - registry = globals.setdefault("__warningregistry__", {}) - warn_explicit(message, category, filename, lineno, module, registry, - globals) - -def warn_explicit(message, category, filename, lineno, - module=None, registry=None, module_globals=None): - lineno = int(lineno) - if module is None: - module = filename or "" - if module[-3:].lower() == ".py": - module = module[:-3] # XXX What about leading pathname? - if registry is None: - registry = {} - if isinstance(message, Warning): - text = str(message) - category = message.__class__ - else: - text = message - message = category(message) - key = (text, category, lineno) - # Quick test for common case - if registry.get(key): - return - # Search the filters - for item in filters: - action, msg, cat, mod, ln = item - if ((msg is None or msg.match(text)) and - issubclass(category, cat) and - (mod is None or mod.match(module)) and - (ln == 0 or lineno == ln)): - break - else: - action = defaultaction - # Early exit actions - if action == "ignore": - registry[key] = 1 - return - - # Prime the linecache for formatting, in case the - # "file" is actually in a zipfile or something. - linecache.getlines(filename, module_globals) - - if action == "error": - raise message - # Other actions - if action == "once": - registry[key] = 1 - oncekey = (text, category) - if onceregistry.get(oncekey): - return - onceregistry[oncekey] = 1 - elif action == "always": - pass - elif action == "module": - registry[key] = 1 - altkey = (text, category, 0) - if registry.get(altkey): - return - registry[altkey] = 1 - elif action == "default": - registry[key] = 1 - else: - # Unrecognized actions are errors - raise RuntimeError( - "Unrecognized action (%r) in warnings.filters:\n %s" % - (action, item)) - # Print message and context - showwarning(message, category, filename, lineno) - - -class WarningMessage(object): - - """Holds the result of a single showwarning() call.""" - - _WARNING_DETAILS = ("message", "category", "filename", "lineno", "file", - "line") - - def __init__(self, message, category, filename, lineno, file=None, - line=None): - local_values = locals() - for attr in self._WARNING_DETAILS: - setattr(self, attr, local_values[attr]) - self._category_name = category.__name__ if category else None - - def __str__(self): - return ("{message : %r, category : %r, filename : %r, lineno : %s, " - "line : %r}" % (self.message, self._category_name, - self.filename, self.lineno, self.line)) - - -class catch_warnings(object): - - """A context manager that copies and restores the warnings filter upon - exiting the context. - - The 'record' argument specifies whether warnings should be captured by a - custom implementation of warnings.showwarning() and be appended to a list - returned by the context manager. Otherwise None is returned by the context - manager. The objects appended to the list are arguments whose attributes - mirror the arguments to showwarning(). - - The 'module' argument is to specify an alternative module to the module - named 'warnings' and imported under that name. This argument is only useful - when testing the warnings module itself. - - """ - - def __init__(self, record=False, module=None): - """Specify whether to record warnings and if an alternative module - should be used other than sys.modules['warnings']. - - For compatibility with Python 3.0, please consider all arguments to be - keyword-only. - - """ - self._record = record - self._module = sys.modules['warnings'] if module is None else module - self._entered = False - - def __repr__(self): - args = [] - if self._record: - args.append("record=True") - if self._module is not sys.modules['warnings']: - args.append("module=%r" % self._module) - name = type(self).__name__ - return "%s(%s)" % (name, ", ".join(args)) - - def __enter__(self): - if self._entered: - raise RuntimeError("Cannot enter %r twice" % self) - self._entered = True - self._filters = self._module.filters - self._module.filters = self._filters[:] - self._showwarning = self._module.showwarning - if self._record: - log = [] - def showwarning(*args, **kwargs): - log.append(WarningMessage(*args, **kwargs)) - self._module.showwarning = showwarning - return log - else: - return None - - def __exit__(self, *exc_info): - if not self._entered: - raise RuntimeError("Cannot exit %r without entering first" % self) - self._module.filters = self._filters - self._module.showwarning = self._showwarning - - -# filters contains a sequence of filter 5-tuples -# The components of the 5-tuple are: -# - an action: error, ignore, always, default, module, or once -# - a compiled regex that must match the warning message -# - a class representing the warning category -# - a compiled regex that must match the module that is being warned -# - a line number for the line being warning, or 0 to mean any line -# If either if the compiled regexs are None, match anything. -_warnings_defaults = False -try: - from _warnings import (filters, default_action, once_registry, - warn, warn_explicit) - defaultaction = default_action - onceregistry = once_registry - _warnings_defaults = True -except ImportError: - filters = [] - defaultaction = "default" - onceregistry = {} - - -# Module initialization -_processoptions(sys.warnoptions) -if not _warnings_defaults: - silence = [ImportWarning, PendingDeprecationWarning] - # Don't silence DeprecationWarning if -3 or -Q was used. - if not sys.py3kwarning and not sys.flags.division_warning: - silence.append(DeprecationWarning) - for cls in silence: - simplefilter("ignore", category=cls) - bytes_warning = sys.flags.bytes_warning - if bytes_warning > 1: - bytes_action = "error" - elif bytes_warning: - bytes_action = "default" - else: - bytes_action = "ignore" - simplefilter(bytes_action, category=BytesWarning, append=1) -del _warnings_defaults diff --git a/PythonEnv/2.7/Lib/warnings.pyc b/PythonEnv/2.7/Lib/warnings.pyc deleted file mode 100644 index 6e540b538ac0b442391fa4de8acb370c7e7b994d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13991 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 UM{_6jwCOnKQb;Oc)M@8G0U3@}3IG5A diff --git a/PythonEnv/2.7/Scripts/activate b/PythonEnv/2.7/Scripts/activate deleted file mode 100644 index c2c0e6fe2..000000000 --- a/PythonEnv/2.7/Scripts/activate +++ /dev/null @@ -1,80 +0,0 @@ -# This file must be used with "source bin/activate" *from bash* -# you cannot run it directly - -deactivate () { - unset pydoc - - # reset old environment variables - if [ -n "$_OLD_VIRTUAL_PATH" ] ; then - PATH="$_OLD_VIRTUAL_PATH" - export PATH - unset _OLD_VIRTUAL_PATH - fi - if [ -n "$_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" -o -n "$ZSH_VERSION" ] ; then - hash -r 2>/dev/null - fi - - if [ -n "$_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="$(if [ "$OSTYPE" "==" "cygwin" ]; then cygpath -u 'd:\github\WinAlfred\WinAlfred\bin\Debug\PythonEnv\2.7'; else echo '/d/github/WinAlfred/WinAlfred/bin/Debug/PythonEnv/2.7'; fi;)" -export VIRTUAL_ENV - -_OLD_VIRTUAL_PATH="$PATH" -PATH="$VIRTUAL_ENV/Scripts:$PATH" -export PATH - -# unset PYTHONHOME if set -# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) -# could use `if (set -u; : $PYTHONHOME) ;` in bash -if [ -n "$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 - if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then - # special case for Aspen magic directories - # see http://www.zetadev.com/software/aspen/ - PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" - else - PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" - fi - fi - export PS1 -fi - -alias 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" -o -n "$ZSH_VERSION" ] ; then - hash -r 2>/dev/null -fi diff --git a/PythonEnv/2.7/Scripts/activate.bat b/PythonEnv/2.7/Scripts/activate.bat deleted file mode 100644 index be0f8515a..000000000 --- a/PythonEnv/2.7/Scripts/activate.bat +++ /dev/null @@ -1,26 +0,0 @@ -@echo off -set "VIRTUAL_ENV=d:\github\WinAlfred\WinAlfred\bin\Debug\PythonEnv\2.7" - -if defined _OLD_VIRTUAL_PROMPT ( - set "PROMPT=%_OLD_VIRTUAL_PROMPT%" -) else ( - if not defined PROMPT ( - set "PROMPT=$P$G" - ) - set "_OLD_VIRTUAL_PROMPT=%PROMPT%" -) -set "PROMPT=(2.7) %PROMPT%" - -if not defined _OLD_VIRTUAL_PYTHONHOME ( - set "_OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%" -) -set PYTHONHOME= - -if defined _OLD_VIRTUAL_PATH ( - set "PATH=%_OLD_VIRTUAL_PATH%" -) else ( - set "_OLD_VIRTUAL_PATH=%PATH%" -) -set "PATH=%VIRTUAL_ENV%\Scripts;%PATH%" - -:END diff --git a/PythonEnv/2.7/Scripts/activate.ps1 b/PythonEnv/2.7/Scripts/activate.ps1 deleted file mode 100644 index e40ca1bf0..000000000 --- a/PythonEnv/2.7/Scripts/activate.ps1 +++ /dev/null @@ -1,148 +0,0 @@ -# This file must be dot sourced from PoSh; you cannot run it -# directly. Do this: . ./activate.ps1 - -# FIXME: clean up unused vars. -$script:THIS_PATH = $myinvocation.mycommand.path -$script:BASE_DIR = split-path (resolve-path "$THIS_PATH/..") -Parent -$script:DIR_NAME = split-path $BASE_DIR -Leaf - -function global:deactivate ( [switch] $NonDestructive ){ - - if ( test-path variable:_OLD_VIRTUAL_PATH ) { - $env:PATH = $variable:_OLD_VIRTUAL_PATH - remove-variable "_OLD_VIRTUAL_PATH" -scope global - } - - if ( test-path function:_old_virtual_prompt ) { - $function:prompt = $function:_old_virtual_prompt - remove-item function:\_old_virtual_prompt - } - - if ($env:VIRTUAL_ENV) { - $old_env = split-path $env:VIRTUAL_ENV -leaf - remove-item env:VIRTUAL_ENV -erroraction silentlycontinue - } - - if ( !$NonDestructive ) { - # Self destruct! - remove-item function:deactivate - } -} - -# unset irrelevant variables -deactivate -nondestructive - -$VIRTUAL_ENV = $BASE_DIR -$env:VIRTUAL_ENV = $VIRTUAL_ENV - -$global:_OLD_VIRTUAL_PATH = $env:PATH -$env:PATH = "$env:VIRTUAL_ENV/Scripts;" + $env:PATH -function global:_old_virtual_prompt { "" } -$function:_old_virtual_prompt = $function:prompt -function global:prompt { - # Add a prefix to the current prompt, but don't discard it. - write-host "($(split-path $env:VIRTUAL_ENV -leaf)) " -nonewline - & $function:_old_virtual_prompt -} - -# SIG # Begin signature block -# MIISeAYJKoZIhvcNAQcCoIISaTCCEmUCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB -# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR -# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUS5reBwSg3zOUwhXf2jPChZzf -# yPmggg6tMIIGcDCCBFigAwIBAgIBJDANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQG -# EwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERp -# Z2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2Vy -# dGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDcxMDI0MjIwMTQ2WhcNMTcxMDI0MjIw -# MTQ2WjCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xKzAp -# BgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcxODA2BgNV -# BAMTL1N0YXJ0Q29tIENsYXNzIDIgUHJpbWFyeSBJbnRlcm1lZGlhdGUgT2JqZWN0 -# IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyiOLIjUemqAbPJ1J -# 0D8MlzgWKbr4fYlbRVjvhHDtfhFN6RQxq0PjTQxRgWzwFQNKJCdU5ftKoM5N4YSj -# Id6ZNavcSa6/McVnhDAQm+8H3HWoD030NVOxbjgD/Ih3HaV3/z9159nnvyxQEckR -# ZfpJB2Kfk6aHqW3JnSvRe+XVZSufDVCe/vtxGSEwKCaNrsLc9pboUoYIC3oyzWoU -# TZ65+c0H4paR8c8eK/mC914mBo6N0dQ512/bkSdaeY9YaQpGtW/h/W/FkbQRT3sC -# pttLVlIjnkuY4r9+zvqhToPjxcfDYEf+XD8VGkAqle8Aa8hQ+M1qGdQjAye8OzbV -# uUOw7wIDAQABo4IB6TCCAeUwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -# AQYwHQYDVR0OBBYEFNBOD0CZbLhLGW87KLjg44gHNKq3MB8GA1UdIwQYMBaAFE4L -# 7xqkQFulF2mHMMo0aEPQQa7yMD0GCCsGAQUFBwEBBDEwLzAtBggrBgEFBQcwAoYh -# aHR0cDovL3d3dy5zdGFydHNzbC5jb20vc2ZzY2EuY3J0MFsGA1UdHwRUMFIwJ6Al -# oCOGIWh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3Nmc2NhLmNybDAnoCWgI4YhaHR0 -# cDovL2NybC5zdGFydHNzbC5jb20vc2ZzY2EuY3JsMIGABgNVHSAEeTB3MHUGCysG -# AQQBgbU3AQIBMGYwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29t -# L3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t -# L2ludGVybWVkaWF0ZS5wZGYwEQYJYIZIAYb4QgEBBAQDAgABMFAGCWCGSAGG+EIB -# DQRDFkFTdGFydENvbSBDbGFzcyAyIFByaW1hcnkgSW50ZXJtZWRpYXRlIE9iamVj -# dCBTaWduaW5nIENlcnRpZmljYXRlczANBgkqhkiG9w0BAQUFAAOCAgEAcnMLA3Va -# N4OIE9l4QT5OEtZy5PByBit3oHiqQpgVEQo7DHRsjXD5H/IyTivpMikaaeRxIv95 -# baRd4hoUcMwDj4JIjC3WA9FoNFV31SMljEZa66G8RQECdMSSufgfDYu1XQ+cUKxh -# D3EtLGGcFGjjML7EQv2Iol741rEsycXwIXcryxeiMbU2TPi7X3elbwQMc4JFlJ4B -# y9FhBzuZB1DV2sN2irGVbC3G/1+S2doPDjL1CaElwRa/T0qkq2vvPxUgryAoCppU -# FKViw5yoGYC+z1GaesWWiP1eFKAL0wI7IgSvLzU3y1Vp7vsYaxOVBqZtebFTWRHt -# XjCsFrrQBngt0d33QbQRI5mwgzEp7XJ9xu5d6RVWM4TPRUsd+DDZpBHm9mszvi9g -# VFb2ZG7qRRXCSqys4+u/NLBPbXi/m/lU00cODQTlC/euwjk9HQtRrXQ/zqsBJS6U -# J+eLGw1qOfj+HVBl/ZQpfoLk7IoWlRQvRL1s7oirEaqPZUIWY/grXq9r6jDKAp3L -# ZdKQpPOnnogtqlU4f7/kLjEJhrrc98mrOWmVMK/BuFRAfQ5oDUMnVmCzAzLMjKfG -# cVW/iMew41yfhgKbwpfzm3LBr1Zv+pEBgcgW6onRLSAn3XHM0eNtz+AkxH6rRf6B -# 2mYhLEEGLapH8R1AMAo4BbVFOZR5kXcMCwowggg1MIIHHaADAgECAgIEuDANBgkq -# hkiG9w0BAQUFADCBjDELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0 -# ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcx -# ODA2BgNVBAMTL1N0YXJ0Q29tIENsYXNzIDIgUHJpbWFyeSBJbnRlcm1lZGlhdGUg -# T2JqZWN0IENBMB4XDTExMTIwMzE1MzQxOVoXDTEzMTIwMzE0NTgwN1owgYwxIDAe -# BgNVBA0TFzU4MTc5Ni1HaDd4Zkp4a3hRU0lPNEUwMQswCQYDVQQGEwJERTEPMA0G -# A1UECBMGQmVybGluMQ8wDQYDVQQHEwZCZXJsaW4xFjAUBgNVBAMTDUphbm5pcyBM -# ZWlkZWwxITAfBgkqhkiG9w0BCQEWEmphbm5pc0BsZWlkZWwuaW5mbzCCAiIwDQYJ -# KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMcPeABYdN7nPq/AkZ/EkyUBGx/l2Yui -# Lfm8ZdLG0ulMb/kQL3fRY7sUjYPyn9S6PhqqlFnNoGHJvbbReCdUC9SIQYmOEjEA -# raHfb7MZU10NjO4U2DdGucj2zuO5tYxKizizOJF0e4yRQZVxpUGdvkW/+GLjCNK5 -# L7mIv3Z1dagxDKHYZT74HXiS4VFUwHF1k36CwfM2vsetdm46bdgSwV+BCMmZICYT -# IJAS9UQHD7kP4rik3bFWjUx08NtYYFAVOd/HwBnemUmJe4j3IhZHr0k1+eDG8hDH -# KVvPgLJIoEjC4iMFk5GWsg5z2ngk0LLu3JZMtckHsnnmBPHQK8a3opUNd8hdMNJx -# gOwKjQt2JZSGUdIEFCKVDqj0FmdnDMPfwy+FNRtpBMl1sz78dUFhSrnM0D8NXrqa -# 4rG+2FoOXlmm1rb6AFtpjAKksHRpYcPk2DPGWp/1sWB+dUQkS3gOmwFzyqeTuXpT -# 0juqd3iAxOGx1VRFQ1VHLLf3AzV4wljBau26I+tu7iXxesVucSdsdQu293jwc2kN -# xK2JyHCoZH+RyytrwS0qw8t7rMOukU9gwP8mn3X6mgWlVUODMcHTULjSiCEtvyZ/ -# aafcwjUbt4ReEcnmuZtWIha86MTCX7U7e+cnpWG4sIHPnvVTaz9rm8RyBkIxtFCB -# nQ3FnoQgyxeJAgMBAAGjggOdMIIDmTAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIH -# gDAuBgNVHSUBAf8EJDAiBggrBgEFBQcDAwYKKwYBBAGCNwIBFQYKKwYBBAGCNwoD -# DTAdBgNVHQ4EFgQUWyCgrIWo8Ifvvm1/YTQIeMU9nc8wHwYDVR0jBBgwFoAU0E4P -# QJlsuEsZbzsouODjiAc0qrcwggIhBgNVHSAEggIYMIICFDCCAhAGCysGAQQBgbU3 -# AQICMIIB/zAuBggrBgEFBQcCARYiaHR0cDovL3d3dy5zdGFydHNzbC5jb20vcG9s -# aWN5LnBkZjA0BggrBgEFBQcCARYoaHR0cDovL3d3dy5zdGFydHNzbC5jb20vaW50 -# ZXJtZWRpYXRlLnBkZjCB9wYIKwYBBQUHAgIwgeowJxYgU3RhcnRDb20gQ2VydGlm -# aWNhdGlvbiBBdXRob3JpdHkwAwIBARqBvlRoaXMgY2VydGlmaWNhdGUgd2FzIGlz -# c3VlZCBhY2NvcmRpbmcgdG8gdGhlIENsYXNzIDIgVmFsaWRhdGlvbiByZXF1aXJl -# bWVudHMgb2YgdGhlIFN0YXJ0Q29tIENBIHBvbGljeSwgcmVsaWFuY2Ugb25seSBm -# b3IgdGhlIGludGVuZGVkIHB1cnBvc2UgaW4gY29tcGxpYW5jZSBvZiB0aGUgcmVs -# eWluZyBwYXJ0eSBvYmxpZ2F0aW9ucy4wgZwGCCsGAQUFBwICMIGPMCcWIFN0YXJ0 -# Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MAMCAQIaZExpYWJpbGl0eSBhbmQg -# d2FycmFudGllcyBhcmUgbGltaXRlZCEgU2VlIHNlY3Rpb24gIkxlZ2FsIGFuZCBM -# aW1pdGF0aW9ucyIgb2YgdGhlIFN0YXJ0Q29tIENBIHBvbGljeS4wNgYDVR0fBC8w -# LTAroCmgJ4YlaHR0cDovL2NybC5zdGFydHNzbC5jb20vY3J0YzItY3JsLmNybDCB -# iQYIKwYBBQUHAQEEfTB7MDcGCCsGAQUFBzABhitodHRwOi8vb2NzcC5zdGFydHNz -# bC5jb20vc3ViL2NsYXNzMi9jb2RlL2NhMEAGCCsGAQUFBzAChjRodHRwOi8vYWlh -# LnN0YXJ0c3NsLmNvbS9jZXJ0cy9zdWIuY2xhc3MyLmNvZGUuY2EuY3J0MCMGA1Ud -# EgQcMBqGGGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tLzANBgkqhkiG9w0BAQUFAAOC -# AQEAhrzEV6zwoEtKjnFRhCsjwiPykVpo5Eiye77Ve801rQDiRKgSCCiW6g3HqedL -# OtaSs65Sj2pm3Viea4KR0TECLcbCTgsdaHqw2x1yXwWBQWZEaV6EB05lIwfr94P1 -# SFpV43zkuc+bbmA3+CRK45LOcCNH5Tqq7VGTCAK5iM7tvHwFlbQRl+I6VEL2mjpF -# NsuRjDOVrv/9qw/a22YJ9R7Y1D0vUSs3IqZx2KMUaYDP7H2mSRxJO2nADQZBtriF -# gTyfD3lYV12MlIi5CQwe3QC6DrrfSMP33i5Wa/OFJiQ27WPxmScYVhiqozpImFT4 -# PU9goiBv9RKXdgTmZE1PN0NQ5jGCAzUwggMxAgEBMIGTMIGMMQswCQYDVQQGEwJJ -# TDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0 -# YWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4MDYGA1UEAxMvU3RhcnRDb20gQ2xhc3Mg -# MiBQcmltYXJ5IEludGVybWVkaWF0ZSBPYmplY3QgQ0ECAgS4MAkGBSsOAwIaBQCg -# eDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEE -# AYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJ -# BDEWBBRVGw0FDSiaIi38dWteRUAg/9Pr6DANBgkqhkiG9w0BAQEFAASCAgCInvOZ -# FdaNFzbf6trmFDZKMojyx3UjKMCqNjHVBbuKY0qXwFC/ElYDV1ShJ2CBZbdurydO -# OQ6cIQ0KREOCwmX/xB49IlLHHUxNhEkVv7HGU3EKAFf9IBt9Yr7jikiR9cjIsfHK -# 4cjkoKJL7g28yEpLLkHt1eo37f1Ga9lDWEa5Zq3U5yX+IwXhrUBm1h8Xr033FhTR -# VEpuSz6LHtbrL/zgJnCzJ2ahjtJoYevdcWiNXffosJHFaSfYDDbiNsPRDH/1avmb -# 5j/7BhP8BcBaR6Fp8tFbNGIcWHHGcjqLMnTc4w13b7b4pDhypqElBa4+lCmwdvv9 -# GydYtRgPz8GHeoBoKj30YBlMzRIfFYaIFGIC4Ai3UEXkuH9TxYohVbGm/W0Kl4Lb -# RJ1FwiVcLcTOJdgNId2vQvKc+jtNrjcg5SP9h2v/C4aTx8tyc6tE3TOPh2f9b8DL -# S+SbVArJpuJqrPTxDDoO1QNjTgLcdVYeZDE+r/NjaGZ6cMSd8db3EaG3ijD/0bud -# SItbm/OlNVbQOFRR76D+ZNgPcU5iNZ3bmvQQIg6aSB9MHUpIE/SeCkNl9YeVk1/1 -# GFULgNMRmIYP4KLvu9ylh5Gu3hvD5VNhH6+FlXANwFy07uXks5uF8mfZVxVCnodG -# xkNCx+6PsrA5Z7WP4pXcmYnMn97npP/Q9EHJWw== -# SIG # End signature block diff --git a/PythonEnv/2.7/Scripts/activate_this.py b/PythonEnv/2.7/Scripts/activate_this.py deleted file mode 100644 index ea12c28ac..000000000 --- a/PythonEnv/2.7/Scripts/activate_this.py +++ /dev/null @@ -1,34 +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 sys -import os - -old_os_path = os.environ['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) -import site -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/PythonEnv/2.7/Scripts/deactivate.bat b/PythonEnv/2.7/Scripts/deactivate.bat deleted file mode 100644 index fd4db2645..000000000 --- a/PythonEnv/2.7/Scripts/deactivate.bat +++ /dev/null @@ -1,20 +0,0 @@ -@echo off - -set VIRTUAL_ENV= - -if defined _OLD_VIRTUAL_PROMPT ( - set "PROMPT=%_OLD_VIRTUAL_PROMPT%" - set _OLD_VIRTUAL_PROMPT= -) - -if defined _OLD_VIRTUAL_PYTHONHOME ( - set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" - set _OLD_VIRTUAL_PYTHONHOME= -) - -if defined _OLD_VIRTUAL_PATH ( - set "PATH=%_OLD_VIRTUAL_PATH%" - set _OLD_VIRTUAL_PATH= -) - -:END diff --git a/PythonEnv/2.7/Scripts/easy_install-2.7-script.py b/PythonEnv/2.7/Scripts/easy_install-2.7-script.py deleted file mode 100644 index 51ab49108..000000000 --- a/PythonEnv/2.7/Scripts/easy_install-2.7-script.py +++ /dev/null @@ -1,10 +0,0 @@ -#!d:\github\WinAlfred\WinAlfred\bin\Debug\PythonEnv\2.7\Scripts\python.exe -# EASY-INSTALL-ENTRY-SCRIPT: 'setuptools==0.9.8','console_scripts','easy_install-2.7' -__requires__ = 'setuptools==0.9.8' -import sys -from pkg_resources import load_entry_point - -if __name__ == '__main__': - sys.exit( - load_entry_point('setuptools==0.9.8', 'console_scripts', 'easy_install-2.7')() - ) diff --git a/PythonEnv/2.7/Scripts/easy_install-2.7.exe b/PythonEnv/2.7/Scripts/easy_install-2.7.exe deleted file mode 100644 index 675e6bf3743f3d3011c238657e7128ee9960ef7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74752 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 diff --git a/PythonEnv/2.7/Scripts/easy_install-script.py b/PythonEnv/2.7/Scripts/easy_install-script.py deleted file mode 100644 index eddb8efb6..000000000 --- a/PythonEnv/2.7/Scripts/easy_install-script.py +++ /dev/null @@ -1,10 +0,0 @@ -#!d:\github\WinAlfred\WinAlfred\bin\Debug\PythonEnv\2.7\Scripts\python.exe -# EASY-INSTALL-ENTRY-SCRIPT: 'setuptools==0.9.8','console_scripts','easy_install' -__requires__ = 'setuptools==0.9.8' -import sys -from pkg_resources import load_entry_point - -if __name__ == '__main__': - sys.exit( - load_entry_point('setuptools==0.9.8', 'console_scripts', 'easy_install')() - ) diff --git a/PythonEnv/2.7/Scripts/easy_install.exe b/PythonEnv/2.7/Scripts/easy_install.exe deleted file mode 100644 index 675e6bf3743f3d3011c238657e7128ee9960ef7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74752 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 diff --git a/PythonEnv/2.7/Scripts/pip-2.7-script.py b/PythonEnv/2.7/Scripts/pip-2.7-script.py deleted file mode 100644 index 3826512f4..000000000 --- a/PythonEnv/2.7/Scripts/pip-2.7-script.py +++ /dev/null @@ -1,10 +0,0 @@ -#!d:\github\WinAlfred\WinAlfred\bin\Debug\PythonEnv\2.7\Scripts\python.exe -# EASY-INSTALL-ENTRY-SCRIPT: 'pip==1.4.1','console_scripts','pip-2.7' -__requires__ = 'pip==1.4.1' -import sys -from pkg_resources import load_entry_point - -if __name__ == '__main__': - sys.exit( - load_entry_point('pip==1.4.1', 'console_scripts', 'pip-2.7')() - ) diff --git a/PythonEnv/2.7/Scripts/pip-2.7.exe b/PythonEnv/2.7/Scripts/pip-2.7.exe deleted file mode 100644 index 675e6bf3743f3d3011c238657e7128ee9960ef7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74752 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 diff --git a/PythonEnv/2.7/Scripts/pip-script.py b/PythonEnv/2.7/Scripts/pip-script.py deleted file mode 100644 index 6f6939bd3..000000000 --- a/PythonEnv/2.7/Scripts/pip-script.py +++ /dev/null @@ -1,10 +0,0 @@ -#!d:\github\WinAlfred\WinAlfred\bin\Debug\PythonEnv\2.7\Scripts\python.exe -# EASY-INSTALL-ENTRY-SCRIPT: 'pip==1.4.1','console_scripts','pip' -__requires__ = 'pip==1.4.1' -import sys -from pkg_resources import load_entry_point - -if __name__ == '__main__': - sys.exit( - load_entry_point('pip==1.4.1', 'console_scripts', 'pip')() - ) diff --git a/PythonEnv/2.7/Scripts/pip.exe b/PythonEnv/2.7/Scripts/pip.exe deleted file mode 100644 index 675e6bf3743f3d3011c238657e7128ee9960ef7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74752 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 diff --git a/PythonEnv/2.7/Scripts/python.exe b/PythonEnv/2.7/Scripts/python.exe deleted file mode 100644 index abc25ddb6ed66d1bfe3f58de77b3fd3437b8e21f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27136 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 diff --git a/PythonEnv/2.7/Scripts/pythonw.exe b/PythonEnv/2.7/Scripts/pythonw.exe deleted file mode 100644 index bf4e6f12b61690f689e5eeabcfe7b58b28e2f421..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27648 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 diff --git a/WinAlfred.Plugin/PluginMetadata.cs b/WinAlfred.Plugin/PluginMetadata.cs index cdafc8e9e..5238f84ad 100644 --- a/WinAlfred.Plugin/PluginMetadata.cs +++ b/WinAlfred.Plugin/PluginMetadata.cs @@ -13,6 +13,7 @@ namespace WinAlfred.Plugin public string Language { get; set; } public string Description { get; set; } public string ExecuteFile { get; set; } + public string PluginDirecotry { get; set; } public string ActionKeyword { get; set; } } } diff --git a/WinAlfred.Plugin/Result.cs b/WinAlfred.Plugin/Result.cs index 75ea7b194..80ae99bda 100644 --- a/WinAlfred.Plugin/Result.cs +++ b/WinAlfred.Plugin/Result.cs @@ -11,5 +11,10 @@ namespace WinAlfred.Plugin public Action Action { get; set; } public int Score { get; set; } public List ContextResults { get; set; } + + ///

+ /// you don't need to set this property if you are developing a plugin + /// + public string PluginDirectory { get; set; } } } \ No newline at end of file diff --git a/WinAlfred.sln b/WinAlfred.sln index 7ea4c9a00..cb022396d 100644 --- a/WinAlfred.sln +++ b/WinAlfred.sln @@ -9,10 +9,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugin", "Plugin", "{3A73F5 EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinAlfred.Plugin.Everything", "Plugins\WinAlfred.Plugin.Everything\WinAlfred.Plugin.Everything.csproj", "{230AE83F-E92E-4E69-8355-426B305DA9C0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinAlfred", "WinAlfred\WinAlfred.csproj", "{498C79C7-F29E-414B-A53D-0B09EEB67EF2}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinAlfred.Plugin.System", "Plugins\WinAlfred.Plugin.System\WinAlfred.Plugin.System.csproj", "{E515011D-A769-418B-8761-ABE6F29827A0}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinAlfred", "WinAlfred\WinAlfred.csproj", "{DB90F671-D861-46BB-93A3-F1304F5BA1C5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -41,18 +41,18 @@ Global {230AE83F-E92E-4E69-8355-426B305DA9C0}.Release|Any CPU.ActiveCfg = Release|Any CPU {230AE83F-E92E-4E69-8355-426B305DA9C0}.Release|Any CPU.Build.0 = Release|Any CPU {230AE83F-E92E-4E69-8355-426B305DA9C0}.Release|x86.ActiveCfg = Release|Any CPU - {498C79C7-F29E-414B-A53D-0B09EEB67EF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {498C79C7-F29E-414B-A53D-0B09EEB67EF2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {498C79C7-F29E-414B-A53D-0B09EEB67EF2}.Debug|x86.ActiveCfg = Debug|Any CPU - {498C79C7-F29E-414B-A53D-0B09EEB67EF2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {498C79C7-F29E-414B-A53D-0B09EEB67EF2}.Release|Any CPU.Build.0 = Release|Any CPU - {498C79C7-F29E-414B-A53D-0B09EEB67EF2}.Release|x86.ActiveCfg = Release|Any CPU {E515011D-A769-418B-8761-ABE6F29827A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E515011D-A769-418B-8761-ABE6F29827A0}.Debug|Any CPU.Build.0 = Debug|Any CPU {E515011D-A769-418B-8761-ABE6F29827A0}.Debug|x86.ActiveCfg = Debug|Any CPU {E515011D-A769-418B-8761-ABE6F29827A0}.Release|Any CPU.ActiveCfg = Release|Any CPU {E515011D-A769-418B-8761-ABE6F29827A0}.Release|Any CPU.Build.0 = Release|Any CPU {E515011D-A769-418B-8761-ABE6F29827A0}.Release|x86.ActiveCfg = Release|Any CPU + {DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Debug|x86.ActiveCfg = Debug|Any CPU + {DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Release|Any CPU.Build.0 = Release|Any CPU + {DB90F671-D861-46BB-93A3-F1304F5BA1C5}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/WinAlfred/App.config b/WinAlfred/App.config deleted file mode 100644 index 038312508..000000000 --- a/WinAlfred/App.config +++ /dev/null @@ -1,20 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/WinAlfred/App.xaml b/WinAlfred/App.xaml new file mode 100644 index 000000000..f2fe37b41 --- /dev/null +++ b/WinAlfred/App.xaml @@ -0,0 +1,32 @@ + + + + + + + diff --git a/WinAlfred/App.xaml.cs b/WinAlfred/App.xaml.cs new file mode 100644 index 000000000..cc2295037 --- /dev/null +++ b/WinAlfred/App.xaml.cs @@ -0,0 +1,11 @@ +using System.Windows; + +namespace WinAlfred +{ + /// + /// App.xaml 的交互逻辑 + /// + public partial class App : Application + { + } +} diff --git a/WinAlfred/CustomControls/ResultItemControl.Designer.cs b/WinAlfred/CustomControls/ResultItemControl.Designer.cs deleted file mode 100644 index 218b613a4..000000000 --- a/WinAlfred/CustomControls/ResultItemControl.Designer.cs +++ /dev/null @@ -1,128 +0,0 @@ -namespace WinAlfreds.CustomControls -{ - partial class ResultItemControl - { - /// - /// 必需的设计器变量。 - /// - private System.ComponentModel.IContainer components = null; - - /// - /// 清理所有正在使用的资源。 - /// - /// 如果应释放托管资源,为 true;否则为 false。 - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region 组件设计器生成的代码 - - /// - /// 设计器支持所需的方法 - 不要 - /// 使用代码编辑器修改此方法的内容。 - /// - private void InitializeComponent() - { - this.pictureBox1 = new System.Windows.Forms.PictureBox(); - this.lblTitle = new System.Windows.Forms.Label(); - this.lblSubTitle = new System.Windows.Forms.Label(); - this.panel1 = new System.Windows.Forms.Panel(); - this.button1 = new System.Windows.Forms.Button(); - this.panel2 = new System.Windows.Forms.Panel(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); - this.panel1.SuspendLayout(); - this.panel2.SuspendLayout(); - this.SuspendLayout(); - // - // pictureBox1 - // - this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Left; - this.pictureBox1.Location = new System.Drawing.Point(0, 0); - this.pictureBox1.Name = "pictureBox1"; - this.pictureBox1.Size = new System.Drawing.Size(44, 54); - this.pictureBox1.TabIndex = 0; - this.pictureBox1.TabStop = false; - // - // lblTitle - // - this.lblTitle.AutoSize = true; - this.lblTitle.Dock = System.Windows.Forms.DockStyle.Top; - this.lblTitle.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.lblTitle.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(34)))), ((int)(((byte)(34)))), ((int)(((byte)(34))))); - this.lblTitle.Location = new System.Drawing.Point(0, 0); - this.lblTitle.Name = "lblTitle"; - this.lblTitle.Size = new System.Drawing.Size(80, 16); - this.lblTitle.TabIndex = 1; - this.lblTitle.Text = "lblTitle"; - // - // lblSubTitle - // - this.lblSubTitle.AutoSize = true; - this.lblSubTitle.Dock = System.Windows.Forms.DockStyle.Bottom; - this.lblSubTitle.Location = new System.Drawing.Point(0, 42); - this.lblSubTitle.Name = "lblSubTitle"; - this.lblSubTitle.Size = new System.Drawing.Size(71, 12); - this.lblSubTitle.TabIndex = 2; - this.lblSubTitle.Text = "lblSubTitle"; - // - // panel1 - // - this.panel1.Controls.Add(this.button1); - this.panel1.Dock = System.Windows.Forms.DockStyle.Right; - this.panel1.Location = new System.Drawing.Point(341, 0); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(62, 54); - this.panel1.TabIndex = 4; - // - // button1 - // - this.button1.Dock = System.Windows.Forms.DockStyle.Fill; - this.button1.Location = new System.Drawing.Point(0, 0); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(62, 54); - this.button1.TabIndex = 0; - this.button1.Text = "button1"; - this.button1.UseVisualStyleBackColor = true; - // - // panel2 - // - this.panel2.Controls.Add(this.lblTitle); - this.panel2.Controls.Add(this.lblSubTitle); - this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; - this.panel2.Location = new System.Drawing.Point(44, 0); - this.panel2.Name = "panel2"; - this.panel2.Size = new System.Drawing.Size(297, 54); - this.panel2.TabIndex = 5; - // - // ResultItemControl - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.panel2); - this.Controls.Add(this.panel1); - this.Controls.Add(this.pictureBox1); - this.Name = "ResultItemControl"; - this.Size = new System.Drawing.Size(403, 54); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); - this.panel1.ResumeLayout(false); - this.panel2.ResumeLayout(false); - this.panel2.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.PictureBox pictureBox1; - private System.Windows.Forms.Label lblTitle; - private System.Windows.Forms.Label lblSubTitle; - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Button button1; - private System.Windows.Forms.Panel panel2; - } -} diff --git a/WinAlfred/CustomControls/ResultItemControl.cs b/WinAlfred/CustomControls/ResultItemControl.cs deleted file mode 100644 index e0b67c732..000000000 --- a/WinAlfred/CustomControls/ResultItemControl.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using WinAlfred.Plugin; - -namespace WinAlfreds.CustomControls -{ - public partial class ResultItemControl : UserControl - { - public ResultItemControl(Result result) - { - InitializeComponent(); - - lblTitle.Text = result.Title; - lblSubTitle.Text = result.SubTitle; - } - } -} diff --git a/WinAlfred/CustomControls/ResultItemControl.resx b/WinAlfred/CustomControls/ResultItemControl.resx deleted file mode 100644 index 7080a7d11..000000000 --- a/WinAlfred/CustomControls/ResultItemControl.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/WinAlfred/FrmMain.Designer.cs b/WinAlfred/FrmMain.Designer.cs deleted file mode 100644 index e04cc25d1..000000000 --- a/WinAlfred/FrmMain.Designer.cs +++ /dev/null @@ -1,84 +0,0 @@ -namespace WinAlfred -{ - partial class FrmMain - { - /// - /// 必需的设计器变量。 - /// - private System.ComponentModel.IContainer components = null; - - /// - /// 清理所有正在使用的资源。 - /// - /// 如果应释放托管资源,为 true;否则为 false。 - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows 窗体设计器生成的代码 - - /// - /// 设计器支持所需的方法 - 不要 - /// 使用代码编辑器修改此方法的内容。 - /// - private void InitializeComponent() - { - this.tbQuery = new System.Windows.Forms.TextBox(); - this.pnlResults = new System.Windows.Forms.Panel(); - this.SuspendLayout(); - // - // tbQuery - // - this.tbQuery.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.tbQuery.Location = new System.Drawing.Point(12, 12); - this.tbQuery.Name = "tbQuery"; - this.tbQuery.Size = new System.Drawing.Size(471, 21); - this.tbQuery.TabIndex = 0; - this.tbQuery.TextChanged += new System.EventHandler(this.TbQuery_TextChanged); - this.tbQuery.KeyDown += new System.Windows.Forms.KeyEventHandler(this.tbQuery_KeyDown); - // - // pnlResults - // - this.pnlResults.AutoSize = true; - this.pnlResults.Location = new System.Drawing.Point(12, 39); - this.pnlResults.Name = "pnlResults"; - this.pnlResults.Size = new System.Drawing.Size(471, 22); - this.pnlResults.TabIndex = 1; - // - // FrmMain - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.AutoSize = true; - this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; - this.ClientSize = new System.Drawing.Size(495, 72); - this.Controls.Add(this.pnlResults); - this.Controls.Add(this.tbQuery); - this.DoubleBuffered = true; - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "FrmMain"; - this.ShowIcon = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "WinAlfred"; - this.Load += new System.EventHandler(this.FrmMain_Load); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.TextBox tbQuery; - private System.Windows.Forms.Panel pnlResults; - - - } -} - diff --git a/WinAlfred/FrmMain.cs b/WinAlfred/FrmMain.cs deleted file mode 100644 index dd54a3cb7..000000000 --- a/WinAlfred/FrmMain.cs +++ /dev/null @@ -1,89 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using WinAlfred.Helper; -using WinAlfred.Plugin; -using WinAlfred.PluginLoader; -using WinAlfreds.CustomControls; -using WinAlfreds.Helper; - -namespace WinAlfred -{ - public partial class FrmMain : Form - { - public List plugins = new List(); - private List results = new List(); - KeyboardHook hook = new KeyboardHook(); - - public FrmMain() - { - InitializeComponent(); - - hook.KeyPressed += OnHotKey; - hook.RegisterHotKey(XModifierKeys.Alt, Keys.Space); - } - - private void OnHotKey(object sender, KeyPressedEventArgs e) - { - if (!Visible) - { - tbQuery.SelectAll(); - } - Visible = !Visible; - } - - private void FrmMain_Load(object sender, EventArgs e) - { - plugins.AddRange(new PythonPluginLoader().LoadPlugin()); - plugins.AddRange(new CSharpPluginLoader().LoadPlugin()); - } - - private void TbQuery_TextChanged(object sender, EventArgs e) - { - results.Clear(); - foreach (PluginPair pair in plugins) - { - Query q = new Query(tbQuery.Text); - if (pair.Metadata.ActionKeyword == q.ActionName) - { - try - { - results.AddRange(pair.Plugin.Query(q)); - } - catch (Exception queryException) - { - Log.Error(string.Format("Plugin {0} query failed: {1}", pair.Metadata.Name, queryException.Message)); -#if (DEBUG) - { - throw; - } -#endif - } - } - } - var s = results.OrderByDescending(o => o.Score); - - pnlResults.Controls.Clear(); - foreach (Result result in results) - { - ResultItemControl control = new ResultItemControl(result); - pnlResults.Controls.Add(control); - } - } - - private void tbQuery_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Escape) - { - e.Handled = true; - e.SuppressKeyPress = true; - Hide(); - } - } - } -} \ No newline at end of file diff --git a/WinAlfred/FrmMain.resx b/WinAlfred/FrmMain.resx deleted file mode 100644 index 7080a7d11..000000000 --- a/WinAlfred/FrmMain.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/WinAlfred/Helper/KeyboardHook.cs b/WinAlfred/Helper/KeyboardHook.cs index 459027e16..97a775534 100644 --- a/WinAlfred/Helper/KeyboardHook.cs +++ b/WinAlfred/Helper/KeyboardHook.cs @@ -1,9 +1,8 @@ using System; using System.Runtime.InteropServices; using System.Windows.Forms; -using WinAlfred.Helper; -namespace WinAlfreds.Helper +namespace WinAlfred.Helper { public sealed class KeyboardHook : IDisposable { diff --git a/WinAlfred/Helper/Log.cs b/WinAlfred/Helper/Log.cs index 6ac9dd363..6b09fee8a 100644 --- a/WinAlfred/Helper/Log.cs +++ b/WinAlfred/Helper/Log.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; +using System.Reflection; using log4net; namespace WinAlfred.Helper diff --git a/WinAlfred/MainWindow.xaml b/WinAlfred/MainWindow.xaml new file mode 100644 index 000000000..8e8e63c77 --- /dev/null +++ b/WinAlfred/MainWindow.xaml @@ -0,0 +1,19 @@ + + + + + + + diff --git a/WinAlfred/MainWindow.xaml.cs b/WinAlfred/MainWindow.xaml.cs new file mode 100644 index 000000000..4a5758887 --- /dev/null +++ b/WinAlfred/MainWindow.xaml.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using System.IO.Ports; +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Forms; +using System.Windows.Input; +using WinAlfred.Helper; +using WinAlfred.Plugin; +using WinAlfred.PluginLoader; +using KeyEventArgs = System.Windows.Input.KeyEventArgs; + +namespace WinAlfred +{ + public partial class MainWindow : Window + { + private KeyboardHook hook = new KeyboardHook(); + public List plugins = new List(); + private List results = new List(); + + public MainWindow() + { + InitializeComponent(); + hook.KeyPressed += OnHotKey; + hook.RegisterHotKey(XModifierKeys.Alt, Keys.Space); + resultCtrl.resultItemChangedEvent += resultCtrl_resultItemChangedEvent; + } + + private void resultCtrl_resultItemChangedEvent() + { + Height = resultCtrl.pnlContainer.ActualHeight + tbQuery.Height + tbQuery.Margin.Top + tbQuery.Margin.Bottom; + } + + private void OnHotKey(object sender, KeyPressedEventArgs e) + { + if (!IsVisible) + { + ShowWinAlfred(); + } + else + { + HideWinAlfred(); + } + } + + private void TextBoxBase_OnTextChanged(object sender, TextChangedEventArgs e) + { + results.Clear(); + foreach (PluginPair pair in plugins) + { + var q = new Query(tbQuery.Text); + if (pair.Metadata.ActionKeyword == q.ActionName) + { + try + { + results.AddRange(pair.Plugin.Query(q)); + results.ForEach(o => o.PluginDirectory = pair.Metadata.PluginDirecotry); + } + catch (Exception queryException) + { + Log.Error(string.Format("Plugin {0} query failed: {1}", pair.Metadata.Name, + queryException.Message)); +#if (DEBUG) + { + throw; + } +#endif + } + } + } + resultCtrl.AddResults(results.OrderByDescending(o => o.Score).ToList()); + resultCtrl.SelectFirst(); + } + + public void HideWinAlfred() + { + Hide(); + } + + public void ShowWinAlfred() + { + tbQuery.SelectAll(); + Focus(); + tbQuery.Focus(); + Show(); + } + + private void MainWindow_OnLoaded(object sender, RoutedEventArgs e) + { + plugins.AddRange(new PythonPluginLoader().LoadPlugin()); + plugins.AddRange(new CSharpPluginLoader().LoadPlugin()); + + ShowWinAlfred(); + } + + private void TbQuery_OnPreviewKeyDown(object sender, KeyEventArgs e) + { + switch (e.Key) + { + case Key.Escape: + HideWinAlfred(); + e.Handled = true; + break; + + case Key.Down: + resultCtrl.SelectNext(); + e.Handled = true; + break; + + case Key.Up: + resultCtrl.SelectPrev(); + e.Handled = true; + break; + + case Key.Enter: + resultCtrl.AcceptSelect(); + e.Handled = true; + break; + } + } + } +} \ No newline at end of file diff --git a/WinAlfred/PluginLoader/BasePluginLoader.cs b/WinAlfred/PluginLoader/BasePluginLoader.cs index dcdd67210..4b379e548 100644 --- a/WinAlfred/PluginLoader/BasePluginLoader.cs +++ b/WinAlfred/PluginLoader/BasePluginLoader.cs @@ -62,6 +62,7 @@ namespace WinAlfred.PluginLoader metadata.Version = ini.GetSetting("plugin", "Version"); metadata.ActionKeyword = ini.GetSetting("plugin", "ActionKeyword"); metadata.ExecuteFile = AppDomain.CurrentDomain.BaseDirectory + directory + "\\" + ini.GetSetting("plugin", "ExecuteFile"); + metadata.PluginDirecotry = AppDomain.CurrentDomain.BaseDirectory + directory + "\\"; if (!AllowedLanguage.IsAllowed(metadata.Language)) { diff --git a/WinAlfred/PluginLoader/CSharpPluginLoader.cs b/WinAlfred/PluginLoader/CSharpPluginLoader.cs index 6d8521df5..a3cc75a28 100644 --- a/WinAlfred/PluginLoader/CSharpPluginLoader.cs +++ b/WinAlfred/PluginLoader/CSharpPluginLoader.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; -using System.Text; +using System.Threading; using WinAlfred.Helper; using WinAlfred.Plugin; @@ -55,7 +55,16 @@ namespace WinAlfred.PluginLoader } + InitPlugin(plugins); return plugins; } + + private void InitPlugin(List plugins) + { + foreach (IPlugin plugin in plugins.Select(pluginPair => pluginPair.Plugin)) + { + new Thread(plugin.Init).Start(); + } + } } } diff --git a/WinAlfred/PluginLoader/PythonPluginLoader.cs b/WinAlfred/PluginLoader/PythonPluginLoader.cs index 8c702d3ce..6f0aa83db 100644 --- a/WinAlfred/PluginLoader/PythonPluginLoader.cs +++ b/WinAlfred/PluginLoader/PythonPluginLoader.cs @@ -1,10 +1,5 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; -using System.Text; -using IronPython.Hosting; -using Microsoft.Scripting.Hosting; -using WinAlfred.Helper; using WinAlfred.Plugin; namespace WinAlfred.PluginLoader diff --git a/WinAlfred/PluginLoader/PythonPluginWrapper.cs b/WinAlfred/PluginLoader/PythonPluginWrapper.cs index 310e2d64e..37c0bcaee 100644 --- a/WinAlfred/PluginLoader/PythonPluginWrapper.cs +++ b/WinAlfred/PluginLoader/PythonPluginWrapper.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using IronPython.Hosting; using Microsoft.Scripting.Hosting; using WinAlfred.Plugin; diff --git a/WinAlfred/Program.cs b/WinAlfred/Program.cs deleted file mode 100644 index 4e6377bc3..000000000 --- a/WinAlfred/Program.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Windows.Forms; - -namespace WinAlfred -{ - static class Program - { - /// - /// 应用程序的主入口点。 - /// - [STAThread] - static void Main() - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new FrmMain()); - } - } -} diff --git a/WinAlfred/Properties/AssemblyInfo.cs b/WinAlfred/Properties/AssemblyInfo.cs index 21762cc7b..6f65353e5 100644 --- a/WinAlfred/Properties/AssemblyInfo.cs +++ b/WinAlfred/Properties/AssemblyInfo.cs @@ -1,15 +1,17 @@ using System.Reflection; +using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Windows; // 有关程序集的常规信息通过以下 // 特性集控制。更改这些特性值可修改 // 与程序集关联的信息。 -[assembly: AssemblyTitle("WinAlfreds")] +[assembly: AssemblyTitle("WinAlfredWPF")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("WinAlfreds")] +[assembly: AssemblyProduct("WinAlfredWPF")] [assembly: AssemblyCopyright("Copyright © Microsoft 2013")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -19,8 +21,25 @@ using System.Runtime.InteropServices; // 则将该类型上的 ComVisible 特性设置为 true。 [assembly: ComVisible(false)] -// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID -[assembly: Guid("58cdcef9-2715-45be-a57d-1c03c6cb4f90")] +//若要开始生成可本地化的应用程序,请在 +// 中的 .csproj 文件中 +//设置 CultureYouAreCodingWith。例如,如果您在源文件中 +//使用的是美国英语,请将 设置为 en-US。然后取消 +//对以下 NeutralResourceLanguage 特性的注释。更新 +//以下行中的“en-US”以匹配项目文件中的 UICulture 设置。 + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //主题特定资源词典所处位置 + //(在页面或应用程序资源词典中 + // 未找到某个资源的情况下使用) + ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置 + //(在页面、应用程序或任何主题特定资源词典中 + // 未找到某个资源的情况下使用) +)] + // 程序集的版本信息由下面四个值组成: // @@ -34,4 +53,3 @@ using System.Runtime.InteropServices; // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] -[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "config", Watch = true)] \ No newline at end of file diff --git a/WinAlfred/Properties/Resources.Designer.cs b/WinAlfred/Properties/Resources.Designer.cs index ce3391e40..39a831b8c 100644 --- a/WinAlfred/Properties/Resources.Designer.cs +++ b/WinAlfred/Properties/Resources.Designer.cs @@ -1,17 +1,17 @@ //------------------------------------------------------------------------------ // // 此代码由工具生成。 -// 运行时版本: 4.0.30319.18052 +// 运行时版本:4.0.30319.18052 // // 对此文件的更改可能会导致不正确的行为,并且如果 -// 重新生成代码,这些更改将丢失。 +// 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ -namespace WinAlfreds.Properties -{ - - +namespace WinAlfred.Properties { + using System; + + /// /// 一个强类型的资源类,用于查找本地化的字符串等。 /// @@ -22,48 +22,40 @@ namespace WinAlfreds.Properties [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - + internal class Resources { + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { + internal Resources() { } - + /// - /// 返回此类使用的、缓存的 ResourceManager 实例。 + /// 返回此类使用的缓存的 ResourceManager 实例。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WinAlfreds.Properties.Resources", typeof(Resources).Assembly); + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WinAlfred.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } - + /// - /// 为所有资源查找重写当前线程的 CurrentUICulture 属性, - /// 方法是使用此强类型资源类。 + /// 使用此强类型资源类,为所有资源查找 + /// 重写当前线程的 CurrentUICulture 属性。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { + internal static global::System.Globalization.CultureInfo Culture { + get { return resourceCulture; } - set - { + set { resourceCulture = value; } } diff --git a/WinAlfred/Properties/Settings.Designer.cs b/WinAlfred/Properties/Settings.Designer.cs index e9207e267..d6abbf65e 100644 --- a/WinAlfred/Properties/Settings.Designer.cs +++ b/WinAlfred/Properties/Settings.Designer.cs @@ -1,28 +1,24 @@ //------------------------------------------------------------------------------ // -// This code was generated by a tool. -// Runtime Version:4.0.30319.18052 +// 此代码由工具生成。 +// 运行时版本:4.0.30319.18052 // -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ -namespace WinAlfreds.Properties -{ - - +namespace WinAlfred.Properties { + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { + + public static Settings Default { + get { return defaultInstance; } } diff --git a/WinAlfred/Properties/Settings.settings b/WinAlfred/Properties/Settings.settings index 39645652a..033d7a5e9 100644 --- a/WinAlfred/Properties/Settings.settings +++ b/WinAlfred/Properties/Settings.settings @@ -1,7 +1,7 @@  - + - + \ No newline at end of file diff --git a/WinAlfred/ResultItem.xaml b/WinAlfred/ResultItem.xaml new file mode 100644 index 000000000..6b8f6bedf --- /dev/null +++ b/WinAlfred/ResultItem.xaml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + Title + sdfdsf + +